简述:
今天项目遇到了点问题,简单描述为:不同事务A和B。B事务查询mybatis的数据后,A事务更新了该表的数据,B再查时,走缓存还是走sql?
测试案例:
1-不同事务下,为什么一级缓存没有清空
结果:不同事务下,缓存不一样,无法清空。如截图:当执行到更新语句时(同一个表的update),本地缓存并不存在(但我一开始已经执行过一次查询了)。所以无法清空
mybatis的缓存处理在: org.apache.ibatis.executor.BaseExecutor
2-相同事务下,一级缓存是否会被清空
结果:
首先,将select和update放在同一个事务下:
select结果:
执行语句,执行到update时,清空缓存,如下截图:
再次执行select语句:
结果:—>结果更新了 证明同一事务,对同一张表操作才有效。
2-如果去掉事物,一级缓存是否会被清空------>会清空,和同一事务效果一样。
最终解决方法:
1-去掉mybatis一级缓存
2-刷新特定语句的缓存,flushCache=“true” ,如:
<select id="save" parameterType="XX" flushCache="true" useCache="false">
……
</select>
3-去掉事务控制