使用SQL Server的SELECT FOR UPDATE

我使用的Microsoft SQL Server 2005数据库隔离级别READ_COMMITTED和READ_COMMITTED_SNAPSHOT = ON。

现在我想使用:

SELECT * FROM <tablename> FOR UPDATE

…以便其他数据库连接在尝试访问同一行“FOR UPDATE”时阻止。

我试过了:

SELECT * FROM <tablename> WITH (updlock) WHERE id=1

…但是即使选择除“1”之外的其他ID也会阻止所有其他连接。

哪个是正确的提示做一个SELECT FOR UPDATE如已知的Oracle,DB2,MySql?

编辑2009-10-03:

这些是用于创建表和索引的语句:

CREATE TABLE example ( Id BIGINT NOT NULL, TransactionId BIGINT, 
    Terminal BIGINT, Status SMALLINT );
ALTER TABLE example ADD CONSTRAINT index108 PRIMARY KEY ( Id )
CREATE INDEX I108_FkTerminal ON example ( Terminal )
CREATE INDEX I108_Key ON example ( TransactionId )

很多并行进程做这个SELECT:

SELECT * FROM example o WITH (updlock) WHERE o.TransactionId = ?

编辑2009-10-05:

为了更好的概述,我写下了下表中的所有尝试的解决方案:

mechanism              | SELECT on different row blocks | SELECT on same row blocks
-----------------------+--------------------------------+--------------------------
ROWLOCK                | no                             | no
updlock, rowlock       | yes                            | yes
xlock,rowlock          | yes                            | yes
repeatableread         | no                             | no
DBCC TRACEON (1211,-1) | yes                            | yes
rowlock,xlock,holdlock | yes                            | yes
updlock,holdlock       | yes                            | yes
UPDLOCK,READPAST       | no                             | no

I'm looking for        | no                             | yes
最近我有一个deadlock problem,因为Sql Server锁定更多然后必要(页)。你不能真正做任何反对它。现在我们正在捕获死锁异常…我希望我有Oracle。

编辑:
我们正在使用快照隔离,这解决了很多,但不是所有的问题。不幸的是,为了能够使用快照隔离,它必须被数据库服务器允许,这可能在客户站点造成不必要的问题。现在我们不仅捕获死锁异常(当然仍然可能发生),而且捕获后台进程(这不能被用户重复)重复事务的快照并发问题。但这仍然比以前更好。

http://stackoverflow.com/questions/1483725/select-for-update-with-sql-server

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:使用SQL Server的SELECT FOR UPDATE