デッドロックの問題を引き起こしている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)