我有一个导致死锁问题的 SQL 脚本,我想知道在执行按位操作时是否应用了某种特殊锁。
有问题的查询是这样的:
UPDATE pos.prices SET active = 1 WHERE NOT (Attributes & 1 = 1)
列类型 activeBIT
和 Attributes TINYINT
。
原因是大量其他脚本的更新不包括按位与 (&) 执行没有问题。这是此操作的唯一更新,它正在死锁。
它正在死锁的查询是一个大型的、周期性的选择,它具有多个正在获取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)