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