【实际场景】READ COMMITTED下第二次查询为啥不是最新已提交数据?

READ COMMITTED下第二次查询为啥不是最新已提交数据?

一、背景

前段时间和一起青训的言友找我探讨一段代码,代码简化流程如下图所示:
[图片]

简述就是一个增or改的一个操作,对加锁这一操作进行了细粒度化,疑问点是查询了一次数据集判断为此操作为更新操作后又进行了一次查询。后续我推测之所以这样写是由于隔离级别修改成了 READ-COMMITTED,推断它是为了让获取锁的线程准备执行更新操作的时候拿到的数据是最新数据。经过查询确实如此:
[图片]

这事过后本来没有然后了,想着在本地用docker搭建平常没事写写demo啥的需要的环境(轻量方便嘛)-Nacos、MySQL、Redis…本想写一篇一个请求过来从外到框架底层到事务之间都做了什么事情,然后的话就想到一个问题:

问题

MySQL事务隔离级别改成了读已提交,在开启Spring事务的情况下,共用的一个SqlSession,加上一级缓存的存在,俩次一样的查询不应该一定一样吗?那如果第一次查询之后记录变更了第二次查询不应该不能感知到吗?成了重复读的现象了?(后面那人跑来说他mentor说一级缓存关配置中掉了,然后我也没看,想看的话也看不着配置中心的配置,然后博客都写一半了,就继续吧)
而后测试证明了自己的质疑是正确的。

自测

调试一段代码,第一次查询是有日志,且查询结果里面的 age 是为 88:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假正经的小柴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值