DBAtlas · データベース運用アトラス

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 を増やす (ロック構造はここから割り当てられる)。不必要に長いトランザクションを避ける。

DBAtlas で開く →

同じデータベースの他の項目