0

我有一个导致死锁问题的 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)
4

1 回答 1

2

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

于 2013-02-11T18:11:00.677 回答