我们注意到这种奇怪的情况,即不返回任何记录的查询将在WITH(UPDLOCK)指定时等待锁定。
查询很简单
SELECT primaryKey FROM someTable WITH(UPDLOCK)
WHERE columA = 'A'
AND columnB BETWEEN 6 AND 8
AND columnC != 'C' ;
Run Code Online (Sandbox Code Playgroud)
运行此查询的系统使用隔离级别read uncommissed,我们无法更改该级别。
有没有一种方法,例如提示,不会让这个等待,但如果它会产生结果,仍然锁定记录?
我注意到索引的使用在其中发挥了作用,因为其他查询没有这种行为。但遗憾的是,定义索引也不可能。
我想出的唯一解决方案是IF EXISTS在执行实际查询之前在其中抛出一个,但由于竞争条件,它仍然可能发生。
类似的问题已在这里得到解答:Why does UPDLOCK Causes SELECTs tohang (lock)?
如果没有索引来定位要锁定的行,则所有测试行都将被锁定,并且合格行上的锁将被保留,直到事务完成。
但我不认为那里提供的答案适用于我的问题版本,因为查询不会返回“合格”的行。
遗憾的是我无法访问该系统。我们只能对某些表运行查询。
目的是锁定并读取记录(如果存在)并最终更新它。如果缺失则插入。
UPDLOCK使用它是因为根据我的理解,当锁定读未提交隔离时,这是正确的。
该表有主键,但在 where 子句中未使用它。