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

Source: https://habr.com/ru/post/J150075/


All Articles