1206: The total number of locks exceeds the lock table size (전체 락 수가 락 테이블 크기 초과)
MySQL의미
InnoDB가 보유한 락에 할당된 메모리(buffer pool 안의 락 구조)를 소진했다. 단일 트랜잭션이 너무 많은 행/gap 락을 누적할 때 발생하며 트랜잭션은 롤백된다.
원인
매우 큰 단일 트랜잭션: 수백만 행을 한 번에 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'
- 1364Field 'name' doesn't have a default value (필드에 기본값 없음)
- 1236Got fatal error 1236 from master when reading data from binary log (binary log 읽기 중 master로부터 치명적 오류 1236 수신)
- 1129Host 'host' is blocked because of many connection errors (연결 오류가 많아 호스트 차단됨)
- 1194Table 'name' is marked as crashed and should be repaired (테이블이 crashed로 표시되어 복구 필요)
- 1615Prepared statement needs to be re-prepared (prepared statement 재준비 필요)