记录mybatis 清除缓存clearCache后仍查询到旧值问题

记录mybatis 清除缓存clearCache后仍查询到旧值问题

为什么清除mybatis缓存后查询数据库仍是旧值

mybatis的一级缓存是基于sqlsession对象的,每个sqlsession对象里的Executor中都会维护一个HashMap。所以我们在第一次使用sqlsession查询时会先查询数据库,然后把查出来的数据存储到对应Hashmap对象中。第二次使用同一个sqlsession查询时,就直接查询缓存中的数据。于是我进行了下面这个实验。

sqlsession.clearCache()

sqlsession.clearCache()方法是清除缓存的意思,执行这个方法可以把第一次查询结果缓存的数据清除掉,第二次查询就直接查询数据库。所以我在两次查询中间加了一个sqlsession.clearCache()方法,我的目的是第一次查询数据库的值是“A”,此时我修改数据库的值为“B”,清除缓存后,期望第二次查询能够得到数据库的新值“B”。但是结果出乎意料,第二次查询结果还是“B”。如下图。
这是数据库原始数据
接下来我的代码执行步骤如下:
代码执行步骤
执行结果如下:
执行结果
可以看出,第一次执行查询到的username是A,而清除缓存后我将数据库的值手动修改为了B,但是为什么第二次查询打印出来的还是A呢?清除缓存后第二次查询不是要查询数据库吗?

经过研究发现,这原来和事务的隔离级别有关系,我们都知道mysql默认的事务隔离级别为“可重复读”,也就是一个事务不管读多少次,即使另外一个事务修改了数据,它都会读到之前读到的值。

接下来修改mysql全局事务隔离级别,修改为读已提交,这里注意一定要修改全局的,而不是会话级别,因为程序执行和我手动修改不在一个会话中,修改后执行结果如下图:
执行结果
由此可得出一下结论,同一个sqlsession执行的多个查询语句是同一个会话,同时还是同一个事务。我们还可以通过一下例子证明这一结论:

首先我们还是设置事务隔离级别为“读已提交”,相关代码如下:
代码执行步骤
由图可以看出来,第一次查询结果是“A”,然后修改为“B”(事务不提交),如果第二次查询还是“A”的话,那就证明代码中执行的数据库操作是不同的事务,因为修改数据后没有commit;如果结果是“B”的话,就可以证明代码中执行的数据库操作是同一个事务。执行结果如下:
执行结果
因此得出结论,代码中执行的数据库操作是同一个事务,只要不提交,一直都是同一个事务。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值