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

问题描述

我正在解决一个 MysqL 应用程序的问题。在某些时候,我的客户端使用包含在 START TRANSACTION; .... COMMIT; 语句中的查询插入一些数据。紧接着另一个客户端来读回数据,它不存在(我确定事情的顺序)。

我正在运行 nodejs、express、MysqL2,并使用连接池和多个语句查询

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

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

解决方法

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

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

另一种测试方法是使用 locking read query,例如 SELECT ... FOR UPDATE。无论客户端的事务隔离级别如何,这都会读取最近提交的数据。也就是说,即使客户端使用 REPEATABLE-READ 启动了他们的事务,锁定读取的行为就像他们使用 READ-COMMITTED 启动了他们的事务一样。