我遇到了一个连接到MySQL的基于Grails的应用程序的问题,其中有一个进程将更新记录作为更大事务的一部分进行更新。此过程还通过Quartz作业启动第二个线程,该作业将执行一些其他更改。 Quartz作业通常在第一个线程提交事务之前启动,因此作业循环最多一分钟,检查记录是否更改为预期状态。奇怪的是,它在某些环境中始终如一地工作,在一个环境中始终如一地失败,在另一个环境中不经常失败。
我的问题与MySQL如何识别两个并发连接之间的事务提交有关。可以预期,当连接A执行提交时,来自连接B的后续查询将识别提交的更改。在我的情况下,连接B将在连接A进行提交之前进行一次或多次相同的查询。似乎mySQL正在缓存连接的查询结果。奇怪的是,当连接B反复查询并获取旧值时,我可以通过mysql客户端发出相同的查询并查看新值。有没有人知道缓存问题或并发问题?
对于上述观察,我启用了MySQL日志,以便查看单个更新,提交和查询。
各种环境使用不同版本的MySQL,如下所示。我正在将我的环境升级到最新的MySQL,看看是否能解决它。
5.0.51a - 两个环境一直非常稳定且不经常发生,但是一个环境开始在周末出现增加,且流量适中。
5.1.55 - 一个环境始终失败
谢谢,
约翰