原因: 一个@Transactional注解的方法中,连续查询了两次sql,参数一致,两次查询过后再update
未加事务时,一切正常。加上事务后,导致两次查询结果不一致,debug后发现加入注解后,两次的sqlSessionProxy对象一致,导致一级缓存生效。
下面是未加事务时,sqlSessionProxy对象


下面是加上注解后,sqlSessionProxy对象


解决方案: 由于项目中引入了集中缓存redis,并自己对@Cacheable注解进行了自定义时间属性的扩展,故禁用mybatis的一级缓存。在mybatis的配置文件中加入
<setting name="localCacheScope" value="STATEMENT" />

探讨了在使用MyBatis框架时,由于事务管理不当导致的一级缓存问题。在事务中连续查询同一SQL语句,参数相同,但查询结果不一致。问题在于事务内的两次查询使用了同一个sqlSessionProxy对象,导致一级缓存生效。解决方法是在MyBatis配置文件中禁用一级缓存。
1583

被折叠的 条评论
为什么被折叠?



