什么可能导致 mysql db read 返回陈旧数据

Wil*_*l59 4 mysql node.js mysql2 express

我正在追查 mysql 应用程序的问题。在某些时候,我的客户端使用包含在语句中的查询插入一些数据START TRANSACTION; .... COMMIT;。之后另一个客户端来读回数据,但它不在那里(我确信事情的顺序)。

我正在运行nodejs、express、mysql2,并使用连接池,进行多语句查询。

有趣的是我在 mysqlworkbench 上看到了奇怪的东西。我只有一个工作台实例,它也看不到新插入的数据。我打开第二个,它看到了新数据。几分钟后,第一个实例仍然看不到新数据。点击“重新连接到 DBMS”,现在它就可以看到它了。如果将工作台行为应用于我的节点客户端,则可以解释我在节点/mysql2 中看到的错误结果。

某处正在进行某种缓存...不知道从哪里开始:-( 有任何指示吗?谢谢!

Bil*_*win 5

听起来您的客户生活在他们自己的数据库快照中,如果他们有一个使用 REPEATABLE-READ 隔离级别的开放事务,则确实如此。换句话说,在该客户端开始其事务之后提交的任何数据对该客户端来说都是不可见的。

一种解决方法是强制启动新事务。只需在客户端会话中运行 COMMIT,它似乎正在查看过时的数据。这将解决任何打开的事务,下一个查询将启动一个新事务。

您可以测试的另一种方法是使用锁定读取查询,例如SELECT ... FOR UPDATE. 这将读取最近提交的数据,无论客户端的事务隔离级别如何。也就是说,即使客户端已使用 REPEATABLE-READ 启动其事务,锁定读取的行为也就像它们已使用 READ-COMMITTED 启动其事务一样。