1206: The total number of locks exceeds the lock table size (o número total de locks excede o tamanho da tabela de locks)
MySQLO que significa?
O InnoDB esgotou a memória alocada para os locks que mantém (as estruturas de lock dentro do buffer pool). Ocorre quando uma única transação acumula locks de linha/gap demais, e a transação sofre rollback.
Por que acontece?
Transações únicas muito grandes: UPDATE/DELETE de milhões de linhas de uma vez, uma cláusula WHERE sem índice que bloqueia a tabela inteira ou um innodb_buffer_pool_size pequeno demais para a carga. Grandes jobs em lote são o gatilho clássico.
Como resolver
Divida DMLs grandes em lotes pequenos (por exemplo, exclua/atualize 10.000 linhas por vez com LIMIT em um loop e faça COMMIT após cada lote). Indexe as colunas do WHERE para reduzir o número de linhas bloqueadas. Como solução permanente, aumente innodb_buffer_pool_size (as estruturas de lock são alocadas a partir dele). Evite transações desnecessariamente longas.
Mais entradas deste banco
- 1526ER_NO_PARTITION_FOR_GIVEN_VALUE: Table has no partition for value (a tabela não tem nenhuma partição para o valor)
- 1049Unknown database 'name'
- 1364Field 'name' doesn't have a default value (o campo não tem valor padrão)
- 1236Got fatal error 1236 from master when reading data from binary log (erro fatal 1236 do master ao ler o binary log)
- 1129Host 'host' is blocked because of many connection errors (host bloqueado por excesso de erros de conexão)
- 1194Table 'name' is marked as crashed and should be repaired (tabela marcada como corrompida; deve ser reparada)
- 1615Prepared statement needs to be re-prepared (o prepared statement precisa ser preparado novamente)