我正在使用具有隔离级别的 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:
为了更好地概述,我在下表中写下了所有尝试过的解决方案:
机制 | 在不同的行块上选择 | 在同一行块上选择 ------------------------------------+-------------- ------+-------------- 行锁 | 没有 | 不 更新锁、行锁 | 是的 | 是的 xlock,rowlock | 是的 | 是的 可重复阅读 | 没有 | 不 DBCC TRACEON (1211,-1) | 是的 | 是的 行锁,xlock,holdlock | 是的 | 是的 上锁,挂锁| 高分辨率照片| CLIPARTO 是的 | 是的 上锁,阅读过去 | 没有 | 不 我在寻找 | 没有 | 是的