我正在使用一个隔离级别为READ_COMMITTED
且READ_COMMITTED_SNAPSHOT=ON
的Microsoft SQL Server 2005数据库。
现在我想使用:
SELECT * FROM <tablename> FOR UPDATE
...以便当其他数据库连接尝试访问同一行“FOR UPDATE”时会被阻塞。
我尝试过:
SELECT * FROM <tablename> WITH (updlock) WHERE id=1
...但这会阻塞所有其他连接,即使选择的ID不是“1”。
在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月5日:
为了更好地概述,我已经在下表中列出了所有尝试过的解决方案:
机制 | 在不同行块上执行SELECT | 在同一行块上执行SELECT -----------------------+---------------------------+-------------------------- ROWLOCK | 否 | 否 updlock, rowlock | 是 | 是 xlock,rowlock | 是 | 是 repeatableread | 否 | 否 DBCC TRACEON (1211,-1) | 是 | 是 rowlock,xlock,holdlock | 是 | 是 updlock,holdlock | 是 | 是 UPDLOCK,READPAST | 否 | 否
我正在寻找 | 否 | 是