spring事务和mybatis缓存在某种不合理代码的使用情况下出现的问题
- 直接上代码
1、测试类
2、普通的一个业务逻辑层调用(orm -mybatis)
3、看结果
4、问题总结
1、这种代码的形式我写的比较直白,为了暂时直接的问题,不要吐槽我,也是为了说明问题
2、简述流程:就是在同一个事物中,重复去提交同一个sqlSession 做查询结果,会用到mybatis 缓存;这个也是正常的;问题在于,如果在第一次拿到结果后对缓存做了操作改变了原本的值,导致第二次再调用查询时,正好使用了缓存结果,就会在视觉上造成逻辑没问题,但是结果是数据不对。仔细查看日志才会发现问题
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4684240f] from current transaction
3、问题:
1、业务代码逻辑有问题,同一个事务中多次调用会缓存的查询
2、代码不够规范,变量需要制定单一职责。
4、解决办法
1、mybatis 缓存强制刷新(不建议,框架本没有错,只是没用好)
2、代码重构 (1、不要在同一事务中重复调用多次相同会缓存的sql(别看demo 比较傻,但实际情况也会有复杂业务中,代码不规范情况下,会出现类似情况);2、对于局部变量的使用,尽量使用final ,需要接受计算结果的对象,最好使用新申明的对象去代替,一个多用,可能会出现意想不到的问题。3、定期重构代码)