一、问题描述:
使用spring @Transaction事务时,在for循环中需要多次执行同一查询语句,第一次查询出对象后,对对象进行修改后,结果再进行第二次查询的时候,查询返回的数据是自己第一次修改后的数据。因为业务需要每次查询都需要取更改数据库,以后的查询都会根据上一次循环修改后的值进行操作。
二、解决方法:
(1)在xml文件 select语句添加 flushCache="true" ,告诉mybatis查询结束后刷新缓存,不记录查询结果到一级缓存中
<select id="pageListCount" resultType="int" flushCache="true">
- 1
(2)本来想找全局配置的方法,但是在网上找到mybatis关闭缓存的属性,但是配置上都不起作用,只有第一种方法好用,这里就不写了
三、原因:
mybatis有一级缓存和二级缓存,mybatis对查询的语句会存在一级缓存中,如果在一个事务中,mybatis对同一个session多次查询同一个sql语句就会去找缓存而不是再去查一次数据库