按位运算符会导致正常比较的锁定吗?

时间:2013-02-11 18:03:10

标签: sql sql-server sql-server-2008

我有一个导致死锁问题的SQL脚本,我想知道在执行按位操作时是否存在某种特殊锁定。

违规查询是:

UPDATE pos.prices SET active = 1 WHERE NOT (Attributes & 1 = 1)

列类型有效BIT和属性TINYINT

原因是大量其他脚本的更新不包括按位AND(&)执行没有问题。这是此操作的唯一更新,它是死锁。

它是一个死锁的查询是一个大的,定期的选择,有多个连接,抓取SCHEMA锁。

修改:此查询会避免表扫描吗?

UPDATE pos.prices SET active = 1 WHERE id in
(SELECT id FROM
(SELECT id, (Attributes & 1) as IsLocked FROM pos.prices) as t1
WHERE NOT IsLocked = 1)

1 个答案:

答案 0 :(得分:2)

对where子句中的列进行计算的任何操作都会阻止对该列使用索引。这导致了表扫描。虽然表扫描不一定会产生死锁,但它可以显着增加它们的概率。