一、背景
前段时间和一起青训的言友找我探讨一段代码,代码简化流程如下图所示:
简述就是一个增or改的一个操作,对加锁这一操作进行了细粒度化,疑问点是查询了一次数据集判断为此操作为更新操作后又进行了一次查询。后续我推测之所以这样写是由于隔离级别修改成了 READ-COMMITTED,推断它是为了让获取锁的线程准备执行更新操作的时候拿到的数据是最新数据。经过查询确实如此:
这事过后本来没有然后了,想着在本地用docker搭建平常没事写写demo啥的需要的环境(轻量方便嘛)-Nacos、MySQL、Redis…本想写一篇一个请求过来从外到框架底层到事务之间都做了什么事情,然后的话就想到一个问题:
问题
MySQL事务隔离级别改成了读已提交,在开启Spring事务的情况下,共用的一个SqlSession,加上一级缓存的存在,俩次一样的查询不应该一定一样吗?那如果第一次查询之后记录变更了第二次查询不应该不能感知到吗?成了重复读的现象了?(后面那人跑来说他mentor说一级缓存关配置中掉了,然后我也没看,想看的话也看不着配置中心的配置,然后博客都写一半了,就继续吧)
而后测试证明了自己的质疑是正确的。
自测
调试一段代码,第一次查询是有日志,且查询结果里面的 age 是为 88: