我们有一台MySQL 5.6 DB服务器,为10个客户提供服务。客户端轮询数据库服务器以查找要处理的记录。我们遇到了间歇性问题,所有客户端都会突然生成"超过锁定等待超时;尝试重启交易"错误,所有这些都在同一时间。在对其中一个事件进行故障排除期间,我们注意到在服务器(Windows Server 2008R2)上,客户端生成错误时服务器时间已更改。我们下次记下了。
今天下次发生了。 10个客户端中有9个产生了错误,当然,当我们检查服务器上的事件查看器时,服务器时间在生成错误的确切时间向前改变了1秒。
有人可以解释一下:
我们已经在处理死锁错误了,实际上并不清楚程序在这个错误的来源。客户端不会同时轮询服务器,而是以大约10秒的间隔随机伪装,这让我们感到困惑,因为很多人会在同一时刻产生错误。
谢谢, 巴勃罗
答案 0 :(得分:0)
可能正在发生的事情是某些线程正在锁定某个记录/表(可能是计划任务是为了备份正在生成锁的DB),并且您的线程正在超时。正如我在评论中所说,请查看innodb状态日志以获取更多详细信息。
避免这种情况的一种方法是使用InnoDB存储引擎,然后微调您的事务隔离级别。
执行SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
如果你看到其中任何一个为REPEATABLE READ
,它是InnoDB的默认设置,则使用
SET tx_isolation = 'READ-COMMITTED';
和SET GLOBAL tx_isolation = 'READ-COMMITTED';