1206: The total number of locks exceeds the lock table size(锁的总数超过了锁表大小)
MySQL含义
InnoDB 已耗尽为其持有的锁分配的内存(buffer pool 中的锁结构)。当单个事务累积了过多的行锁/间隙锁时发生,事务会被回滚。
原因
超大的单个事务:一次性 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'(未知数据库 'name')
- 1364Field 'name' doesn't have a default value(字段 'name' 没有默认值)
- 1236Got fatal error 1236 from master when reading data from binary log(从 master 读取二进制日志数据时收到致命错误 1236)
- 1129Host 'host' is blocked because of many connection errors(主机 'host' 因连接错误过多而被阻止)
- 1194Table 'name' is marked as crashed and should be repaired(表 'name' 被标记为已崩溃,应当修复)
- 1615Prepared statement needs to be re-prepared(预处理语句需要重新准备)