问题
今天遇到了一个问题,在一个for循环中,使用相同的参数执行一个参数,获取的返回结果内存地址是一样的,这就导致了后面的循环处理数据时,把前面的数据也修改了。
打断点查看之后,发现后两次查询的结果,内存地址居然是相同的,搞的我一头雾水。
原因
这个service方法上,加了@Transactional注解。如果在同一个事务中,多次对同一个查询sql进行执行的话,mybatis只会查询一次数据库,而后几次的返回结果实际上是从缓存中取的。
解决
- 把这个查询方法上的@Transactional去掉。
- 在用到的mapper接口上,加上一行注解@Options(flushCache=Options.FlushCachePolicy.TRUE)
- 在用到的mapper接口对应的xml文件中, select语句添加 flushCache="true" <select id="pageListCount" resultType="int" flushCache="true">
参考文章
Mybatis事务下解决多次select语句查询结果一致的问题+案列(获取全局序列ID)_appleyk的博客-CSDN博客