InnoDBのロック(チートシート)

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のようにブロックされます



All Articles