1206: The total number of locks exceeds the lock table size
MySQLЧто это значит?
InnoDB исчерпала память, выделенную под удерживаемые блокировки (структуры блокировок внутри buffer pool). Это происходит, когда одна транзакция накапливает слишком много блокировок строк/промежутков (gap), и транзакция откатывается.
Почему возникает?
Очень большие одиночные транзакции: UPDATE/DELETE миллионов строк за раз, условие WHERE без индекса, блокирующее всю таблицу, или слишком малый для нагрузки innodb_buffer_pool_size. Классический триггер — крупные пакетные задания.
Как исправить
Разбейте большой DML на небольшие пакеты (например, удаляйте/обновляйте по 10,000 строк за раз с LIMIT в цикле и 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
- 1129Host 'host' is blocked because of many connection errors
- 1194Table 'name' is marked as crashed and should be repaired
- 1615Prepared statement needs to be re-prepared