锁定超时超出一个表只发生在其他表上

时间:2015-04-20 04:30:22

标签: mysql

我有一个名为user的表,有25000个条目。在白天,在特定时间我在MySQL中收到此错误:

  

超过锁定等待超时;尝试重新启动交易

我的所有表格列都已正确编入索引 该错误仅发生在此表中,因为我有许多表具有比此表更多的数据。在那些表中我从来没有得到这个超时错误。

1 个答案:

答案 0 :(得分:0)

发生了什么事?

尝试再次找到有关该表的更多详细信息,并了解该场景是什么以及它为何被锁定。

SHOW ENGINE INNODB STATUS\G;
SHOW FULL PROCESSLIST;

为什么会这样?

如果某个事务在该特定表上发生,那么同一个事务上的另一个事务必须等待,因为第一个线程在某个记录上持有记录锁(行级锁定)。

供参考:http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html

enter image description here

这意味着第二个事务必须等待50秒(默认值)才能获得LOCK。

解决步骤:

  1. 如您所说"所有表格列都已正确编入索引"。仍然确保您有外键约束的索引。只需将索引放在将在WHERE条件和&中使用的键上。加入条件。

  2. 考虑增加'innodb_lock_wait_timeout'稍微再检查一下

    set innodb_lock_wait_timeout=120 ;

  3. 默认情况下,Innodb中的数据库事务隔离级别为“可重复读取”。

  4. enter image description here

    考虑将其改为' READ COMMITTED'。

     mysql> SET tx_isolation = 'READ-COMMITTED';
     mysql> SET GLOBAL tx_isolation = 'READ-COMMITTED';