InnoDBでロックの問題を整理することにしました。 結果は非常に短いチートシートです。 たぶん誰かが役に立つでしょう。 発見された不正確さについてコミュニティに感謝します
そして、1つのトランザクション内で、...
更新...どこ
SELECT ... WHEREはブロックなしで実行されます(分離モードSERIALIZABLEでの読み取りを除く)
SELECT ... LOCK IN SHARE MODEはロックが解除されるのを待っています
SELECT ... FOR UPDATEはロックが解除されるのを待っています
ロックの解放を待機しているUPDATEおよびDELETE
UPDATE ... WHEREが分離モードREPEATABLE READまたはSERIALIZABLEで実行され、行が一意のキーによって選択されなかった場合、INSERTはこのキー(いわゆるNEXT-KEY LOCK)にもロックされますが、READ COMMITTEDおよびREAD UNCOMMITTEDではロックは発生しません
DELETE FROM ... WHERE
UPDATE ... WHEREは
SELECT ... WHERE
SERIALIZABLEを除くすべての分離モードで
他のスレッドは読み取り/書き込み/削除ができます
INSERTはUPDATE ... WHEREのようにブロックされます
REPEATABLE READでは、読み取り値は「バッファリング」され、後続のすべての呼び出しは同じ結果を返します。
READ COMMITEDおよびREAD UNCOMMITTEDを使用すると、各リクエストは新しい結果を返します(トランザクションが異なるスレッドで完了した後)
分離モードでシリアライズ可能
他のスレッドは読み取りのみ可能です(SELECT ... FOR UPDATE読み取りを除く)
ロックの解放を待機しているUPDATEおよびDELETE
INSERTはUPDATE ... WHEREのようにブロックされます
選択...共有モードでロック
残りのスレッドは読み取りのみ可能
ロックの解放を待機しているUPDATEおよびDELETE
INSERTはUPDATE ... WHEREのようにブロックされます
SELECT ...更新用
SELECT ... WHERE読み取り可能(分離モードSERIALIZABLEでの読み取りを除く)
SELECT ...共有モードでロックし、SELECT ... FOR UPDATEロックが解除されるのを待ちます
ロックの解放を待機しているUPDATEおよびDELETE
INSERTはUPDATE ... WHEREのようにブロックされます