什么可能导致 mysql 数据库读取到 return 陈旧数据

What could cause mysql db read to return stale data

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

我是运行nodejs,express,mysql2,使用连接池,多语句查询

有趣的是我在mysqlworkbench上看到了奇怪的东西。我只有一个 workbench 实例,它也看不到新插入的数据。我打开第二个,它看到了新数据。几分钟后,第一个实例仍然看不到新数据。点击 'Reconnect to DBMS',现在它看到了。 workbench 行为,如果应用于我的节点客户端,将解释我在节点 / mysql2.

中看到的错误结果

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

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

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

另一种测试方法是使用 locking read query,例如 SELECT ... FOR UPDATE。这将读取最近提交的数据,而不管客户端的事务隔离级别如何。也就是说,即使客户端使用 REPEATABLE-READ 开始他们的事务,锁定读取的行为就好像他们已经使用 READ-COMMITTED 开始他们的事务一样。