我正在使用隔离级别为READ_COMMITTED
和的Microsoft SQL Server 2005数据库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:
为了更好的概述,我在下表中记录了所有尝试过的解决方案:
机制| 在不同的行块上选择| 在同一行块上选择 ----------------------- + -------------------------- ------ + -------------------------- ROWLOCK | 没有 没有 上锁,行锁| 是的 是 xlock,rowlock | 是的 是 重复阅读| 没有 没有 DBCC TRACEON(1211,-1)| 是的 是 行锁,xlock,holdlock | 是的 是 上锁,保持锁| 是的 是 UPDLOCK,READPAST | 没有 没有 我在寻找| 没有 是