デッドロックは複数のトランザクションが複数のレコードをロックする場合にタイミングによって発生する。
- トランザクションAがレコード1をロック→成功
- トランザクションBがレコード2をロック→成功
- トランザクションAがレコード2をロック→2のロックの解放待ち
- トランザクションBがレコード1をロック→1のロックの解放待ち
AもBも互いのロックの解放を待つことになってデッドロックする。 MySQLはデッドロックを検出すると、片方のトランザクションでデッドロックエラーを発生させて強制的にトランザクションを終了させる。
たとえば、次のような2つのトランザクションを同時に動かすとデッドロックエラーが発生する。
CREATE TABLE t (a INT, val INT, …[さらに読む]