小编CSh*_*pie的帖子

不返回任何记录的查询挂在锁上

我们注意到这种奇怪的情况,即不返回任何记录的查询将在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 子句中未使用它。

sql-server locking blocking

5
推荐指数
1
解决办法
983
查看次数

标签 统计

blocking ×1

locking ×1

sql-server ×1