デッドロックはエラー1213
を返します クライアント側で処理する必要があります
デッドロックとロック待機は別のものであることに注意してください。デッドロックでは、「失敗した」トランザクションはありません。どちらも有罪です。どちらがロールバックされるかは保証されません。
次のようなシナリオでデッドロックが発生します:
UPDATE t_first -- transacion 1 locks t_first
SET id = 1;
UPDATE t_second -- transaction 2 locks t_second
SET id = 2;
UPDATE t_second -- transaction 1 waits for transaction 2 to release the lock on t_second
SET id = 2;
UPDATE t_first -- transaction 2 waits for transaction 1 to release the lock on t_first. DEADLOCK
SET id = 2;
ロック待機と混同していませんか?
ロック待機は、トランザクションが別のトランザクションによってすでにロックされているリソースをロックしようとするたびに発生します。
上記の例では、ステップ 3
でロック待機が発生します 。
これは(デッドロックとは異なり)通常の状況であるため、ロックを保持するトランザクション InnoDB
をコミットまたはロールバックすることで、外部から解決できます。 ロックを保持しているトランザクションをロールバックしようとはしません。
代わりに、タイムアウトが発生した後、ロックを取得しようとしたステートメントをキャンセルするだけです。
デフォルトのタイムアウトは50
です 秒であり、 innodb_lock_wait_timeout コード>
。
失敗したステートメント(取得を試みたステートメント ロック)はエラー 1205
を返します 。