トランザクション分離レベルをSERIALIZABLE
に設定した場合 、InnoDB
暗黙的にLOCK IN SHARE MODE
を追加します すべてのSELECT
に ステートメント。
このモードは、SELECT FOR UPDATE
によって設定されたロックと競合します およびSELECT
sはロックされます。
ただし、InnoDB
WHERE
を満たすよりも多くの行をロックする可能性があります 調子。これは、スキャンされたすべての行をロックするためです。 、一致しただけではありません 。
たとえば、col1
にインデックスがあります そしてこのクエリ:
SELECT *
FROM mytable
WHERE col1 = 1
AND col2 = 2
FOR UPDATE
このインデックスを使用します。
これにより、すべてがロックされます col1 = 1
のレコード 、col2 <> 2
の場合でも