3 つの InnoDB
INFORMATION_SCHEMA
テーブルを使用すると、トランザクションのモニタリングや、可能性のあるロックの問題の診断が容易になります。これらの 3 つのテーブルは、INNODB_TRX
、INNODB_LOCKS
、および INNODB_LOCK_WAITS
です。
INNODB_TRX
: 現在InnoDB
の内部で実行中のすべてのトランザクションに関する情報が含まれています。これには、そのトランザクションがロックを待機しているかどうか、そのトランザクションがいつ開始されたか、そのトランザクションが実行している特定の SQL ステートメントなどが含まれます。INNODB_LOCKS
: 別のトランザクションがロックを解放するのを待機している InnoDB 内の各トランザクション (INNODB_TRX.TRX_STATE='LOCK WAIT'
) は、ただ 1 つの「ブロックしているロック要求」によってブロックされます。そのブロックしているロック要求は、互換性がないモードにある別のトランザクションによって保持されている行ロックまたはテーブルロックに対するものです。待機しているトランザクションまたはブロックされているトランザクションは、ほかのトランザクションがコミットまたはロールバックして、要求されたロックを解放するまで処理を続行できません。INNODB_LOCKS
には、ブロックされているトランザクションごとに、そのトランザクションが要求し、かつ待機している各ロックを記述した 1 行が含まれています。INNODB_LOCKS
にはまた、ロックを保持しているトランザクションの状態 ('RUNNING'
、'LOCK WAIT'
、'ROLLING BACK'
、または'COMMITTING'
) にかかわらず、別のトランザクションをブロックしているロックごとの 1 行も含まれています。トランザクションをブロックしているロックは常に、要求されたロックのモードとは互換性のないモード (読み取りと書き込み、共有と排他的など) に保持されています。INNODB_LOCK_WAITS
: このテーブルを使用すると、特定のロックをどのトランザクションが待機しているか、または特定のトランザクションがどのロックを待機しているかがわかります。このテーブルには、ブロックされているトランザクションごとに、そのトランザクションが要求したロックと、その要求をブロックしているロックを示す 1 つ以上の行が含まれています。REQUESTED_LOCK_ID
はトランザクションが要求しているロックを示し、BLOCKING_LOCK_ID
は、最初のトランザクションの続行を妨げている (別のトランザクションによって保持されている) ロックを示します。ブロックされている特定のどのトランザクションでも、INNODB_LOCK_WAITS
内のすべての行がREQUESTED_LOCK_ID
については同じ値を、またBLOCKING_LOCK_ID
については異なる値を持っています。