1206: The total number of locks exceeds the lock table size(ロックの総数がロックテーブルのサイズを超えた)
MySQL意味
InnoDB が保持するロック用に割り当てられたメモリ (バッファプール内のロック構造) を使い果たした。単一のトランザクションが過剰な行ロック/ギャップロックを蓄積した場合に発生し、トランザクションはロールバックされる。
原因
非常に大きな単一トランザクション: 数百万行の一括 UPDATE/DELETE、テーブル全体をロックするインデックスのない WHERE 句、またはワークロードに対して小さすぎる innodb_buffer_pool_size。大規模なバッチジョブが典型的なきっかけ。
対処方法
大きな DML を小さなバッチに分割する (例: ループ内で LIMIT を使って 10,000 行ずつ削除/更新し、各バッチ後に COMMIT する)。WHERE の列にインデックスを作成し、ロックされる行数を減らす。恒久対策として innodb_buffer_pool_size を増やす (ロック構造はここから割り当てられる)。不必要に長いトランザクションを避ける。
同じデータベースの他の項目
- 1526ER_NO_PARTITION_FOR_GIVEN_VALUE: Table has no partition for value(値に対応するパーティションがない)
- 1049Unknown database 'name'(不明なデータベース 'name')
- 1364Field 'name' doesn't have a default value(フィールド 'name' にデフォルト値がない)
- 1236Got fatal error 1236 from master when reading data from binary log(バイナリログの読み取り中にマスターから致命的エラー 1236)
- 1129Host 'host' is blocked because of many connection errors(接続エラーが多いためホスト 'host' がブロックされた)
- 1194Table 'name' is marked as crashed and should be repaired(テーブル 'name' がクラッシュとしてマークされ修復が必要)
- 1615Prepared statement needs to be re-prepared(プリペアド文の再準備が必要)