什么可能导致 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 开始他们的事务一样。
我正在解决 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 开始他们的事务一样。