我正在查找一个mysql应用程序的问题。在某个时刻,我的客户端使用一个封装在START TRANSACTION; .... COMMIT;
语句中的查询来插入一些数据。在那之后,另一个客户端会读取数据,但它不在那里(我确信事情的顺序(。
我正在运行nodejs、express、mysql2,并使用连接池和多语句查询。
有趣的是,我在mysqlworkbench上看到了一些奇怪的东西。我只是有一个工作台实例,它也看不到新插入的数据。我打开第二个,它看到了新的数据。几分钟后,第一个实例仍然看不到新数据。点击"重新连接到DBMS",现在它看到了。如果将工作台行为应用于我的节点客户端,将解释我在node/mysql2中看到的糟糕结果。
某个地方正在进行某种缓存。。。不知道从哪里开始:-(有什么建议吗?谢谢!
听起来您的客户端生活在他们自己的数据库快照中,如果他们有一个使用REPEATABLE-READ隔离级别的打开事务,这将是正确的。换句话说,在该客户端启动其事务之后提交的任何数据对该客户端都不可见。
一种解决方法是强制启动一个新事务。只需在客户端会话中运行COMMIT,它似乎正在查看过时的数据。这将解决任何打开的事务,下一个查询将启动一个新事务。
测试的另一种方法是使用锁定读取查询,如SELECT ... FOR UPDATE
。这将读取最近提交的数据,而与客户端的事务隔离级别无关。也就是说,即使客户端使用REPEATABLE-READ启动了事务,锁定读取的行为就好像他们使用READ-COMMITTED启动了事务一样。