Error number: MY-012677; Symbol: ER_IB_MSG_852; SQLSTATE: HY000
Message: %s
错误说明
ER_IB_MSG_852是MySQL给出的一条错误码,它对应于错误消息“InnoDB: Trying to lock a table. But ‘%s’ already holds the locks for them.”。这条错误消息是指InnoDB在试图锁定一个表时,但一次操作中发现已它已经由另一种类型的锁锁定。改错误码的SQLSTATE为HY000。
常见案例
当MySQL尝试对一个表上锁时,但此表已经被另一种类型的锁锁定,则会出现ER_IB_MSG_852这条错误码,这也是提示MySQL此时无法对该表上锁的消息。
解决方法
1、查看锁的状态:如果有空余的资源,看看是否有未释放的锁,尝试将锁该表的其他连接释放掉,以腾出表锁的空间。可以用如下的SQL来查看:
SHOW ENGINE INNODB STATUSG;
2、增加锁的数量:可以修改MySQL的配置文件来设置Innodb锁的数量,将innodb_lock_wait_timeout的值提高,这样就可以让更多的资源用于表锁,从而避免此错误出现。
3、停止造成锁死的操作:如果是某个操作造成了表锁死,可以停止该任务,以便将释放出来的空间给其他操作。
4、将事务类型设置为READ-UNCOMMITTED:对于SELECT语句,可以使用READ-UNCOMMITTED类型的事务,它可以不去等待任何锁,从而避免像ER_IB_MSG_852这样的错误。可以考虑将搜索型的事务设置成READ-UNCOMMITTED来避免此错误。