我正在使用一个2005年的 Microsoft SQL Server 数据库,其隔离级别为 READ_COMMITTED
和 READ_COMMITTED_SNAPSHOT=ON
。
现在我想用:
SELECT * FROM <tablename> FOR UPDATE
... 以便其他数据库连接在尝试访问同一行“ FOR UPDATE”时阻塞。
我试过:
SELECT * FROM <tablename> WITH (updlock) WHERE id=1
但是这会阻止所有其他连接,即使是选择一个不是“1”的 id。
对于 Oracle、 DB2和 MySql 来说,哪个是执行 SELECT FOR UPDATE
的正确提示?
编辑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