0

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

1 に答える 1

2

where 句の列で計算を行う操作では、その列のインデックスを使用できません。それはテーブルスキャンにつながります。テーブル スキャンによって必ずしもデッドロックが発生するわけではありませんが、デッドロックが発生する可能性が大幅に高くなる可能性があります。

于 2013-02-11T18:11:00.677 に答える