我有一个导致死锁问题的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)
答案 0 :(得分:2)
对where子句中的列进行计算的任何操作都会阻止对该列使用索引。这导致了表扫描。虽然表扫描不一定会产生死锁,但它可以显着增加它们的概率。