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