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