1206: The total number of locks exceeds the lock table size (el número total de bloqueos supera el tamaño de la tabla de bloqueos)
MySQL¿Qué significa?
InnoDB agotó la memoria asignada a los bloqueos que mantiene (las estructuras de bloqueo dentro del buffer pool). Ocurre cuando una sola transacción acumula demasiados bloqueos de fila/gap, y la transacción se revierte.
¿Por qué ocurre?
Transacciones únicas muy grandes: UPDATE/DELETE de millones de filas a la vez, una cláusula WHERE sin índice que bloquea toda la tabla, o un innodb_buffer_pool_size demasiado pequeño para la carga. Los grandes trabajos por lotes son el desencadenante clásico.
Cómo solucionarlo
Divida el DML grande en lotes pequeños (p. ej., elimine/actualice 10,000 filas cada vez con LIMIT en un bucle y COMMIT tras cada lote). Indexe las columnas del WHERE para reducir el número de filas bloqueadas. Como solución permanente, aumente innodb_buffer_pool_size (las estructuras de bloqueo se asignan desde ahí). Evite transacciones innecesariamente largas.
Más entradas de este motor
- 1526ER_NO_PARTITION_FOR_GIVEN_VALUE: Table has no partition for value (la tabla no tiene ninguna partición para el valor)
- 1049Unknown database 'name'
- 1364Field 'name' doesn't have a default value (el campo no tiene valor predeterminado)
- 1236Got fatal error 1236 from master when reading data from binary log (error fatal 1236 del master al leer el binary log)
- 1129Host 'host' is blocked because of many connection errors (host bloqueado por demasiados errores de conexión)
- 1194Table 'name' is marked as crashed and should be repaired (tabla marcada como caída; debe repararse)
- 1615Prepared statement needs to be re-prepared (la sentencia preparada debe volver a prepararse)