mysql事务中, select跟列表的内容不一样

屏幕快照 2019-11-26 上午10.54.56.png

屏幕快照 2019-11-26 上午10.55.01.png

如上图所示, 两张图, id=4的一个开始金额是3,
然后我执行了
begin;
update account set money=4 where id=4;

我再刷新account表内容,还是3, 这可以理解, 因为还没有commit

但是我直接select * from account;执行这个sql的时候, 发现id=4的金额 已经变成4了, 这是为什么呢, 两种情况不一样

刚试了下, 我重新起了个窗口, select执行结果是3, 那这是说明, 是sql的链接问题了? 有事务的那个连接, 就算没有commit值也会变? 应该是有时限的吧?

貌似是连接断开, 会自动回滚, 那么我们写代码正常都是有连接池的, 这个会不会造成什么不好的影响呢

阅读 2.6k
1 个回答

在事务中,普通的 SELECT 语句(非 SELECT ... FOR UPDATE , SELECT ... FOR SHARE)是 nonlocking read,mysql 的官方在 Consistent Nonlocking Reads文档中有一句话:

The exception to this rule is that the query sees the changes made by earlier statements within the same transaction.

也就是说,在同一个事务中,查询语句是能洞察到之前的 DML 对某一行的修改的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题