我有一个名为user
的表,有25000个条目。在白天,在特定时间我在MySQL中收到此错误:
超过锁定等待超时;尝试重新启动交易
我的所有表格列都已正确编入索引 该错误仅发生在此表中,因为我有许多表具有比此表更多的数据。在那些表中我从来没有得到这个超时错误。
答案 0 :(得分:0)
发生了什么事?
尝试再次找到有关该表的更多详细信息,并了解该场景是什么以及它为何被锁定。
SHOW ENGINE INNODB STATUS\G;
SHOW FULL PROCESSLIST;
为什么会这样?
如果某个事务在该特定表上发生,那么同一个事务上的另一个事务必须等待,因为第一个线程在某个记录上持有记录锁(行级锁定)。
供参考:http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html
这意味着第二个事务必须等待50秒(默认值)才能获得LOCK。
解决步骤:
如您所说"所有表格列都已正确编入索引"。仍然确保您有外键约束的索引。只需将索引放在将在WHERE条件和&中使用的键上。加入条件。
考虑增加'innodb_lock_wait_timeout'稍微再检查一下
set innodb_lock_wait_timeout=120 ;
默认情况下,Innodb中的数据库事务隔离级别为“可重复读取”。
考虑将其改为' READ COMMITTED'。
mysql> SET tx_isolation = 'READ-COMMITTED';
mysql> SET GLOBAL tx_isolation = 'READ-COMMITTED';