Mysql 仅在一个表上而不是在另一个表上发生锁定超时

Mysql 仅在一个表上而不是在另一个表上发生锁定超时,mysql,Mysql,我有一个名为user的表,它有25000个条目。在一天中的某个特定时间,我在MySQL中遇到以下错误: 超过锁定等待超时;尝试重新启动事务 我的所有表列都已正确索引。 这个错误只发生在这个表中,因为我有许多表的数据比这个表多。在那些表中,我从未遇到过这个超时错误 发生了什么事? 再次尝试查找有关该表的更多详细信息,并了解该表被锁定的原因和原因 SHOW ENGINE INNODB STATUS\G; SHOW FULL PROCESSLIST; 为什么会发生? 如果某个事务发生在该特定表上,那

我有一个名为
user
的表,它有25000个条目。在一天中的某个特定时间,我在MySQL中遇到以下错误:

超过锁定等待超时;尝试重新启动事务

我的所有表列都已正确索引。

这个错误只发生在这个表中,因为我有许多表的数据比这个表多。在那些表中,我从未遇到过这个超时错误

发生了什么事?

再次尝试查找有关该表的更多详细信息,并了解该表被锁定的原因和原因

SHOW ENGINE INNODB STATUS\G;
SHOW FULL PROCESSLIST;
为什么会发生?

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

供参考:

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

解析步骤:

  • 正如您所说的“所有表列都已正确索引”。仍然要确保外键约束上有索引。只需将索引放在将在WHERE条件和JOIN on条件中使用的键上

  • 考虑稍微增加“innodb\u lock\u wait\u timeout”,然后再次检查

    设置innodb\u lock\u wait\u timeout=120

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

  • 考虑将其更改为“读取已提交”

     mysql> SET tx_isolation = 'READ-COMMITTED';
     mysql> SET GLOBAL tx_isolation = 'READ-COMMITTED';
    
    看,我想这会有帮助的。