Mybatis 二级缓存脏读

  1. 脏读的产生
    Mybatis的二级缓存是和命名空间绑定的,所以通常情况下每一个Mapper映射文件都有自己的二级缓存,不同的mapper的二级缓存互不影响。这样的设计一不注意就会引起脏读,从而导致数据一致性的问题。引起脏读的操作通常发生在多表关联操作中,比如在两个不同的mapper中都涉及到同一个表的增删改查操作,当其中一个mapper对这张表进行查询操作,此时另一个mapper进行了更新操作刷新缓存,然后第一个mapper又查询了一次,那么这次查询出的数据是脏数据。出现脏读的原因是他们的操作的缓存并不是同一个。

  2. 脏读的避免

  • mapper中的操作以单表操作为主,避免在关联操作中使用mapper
  • 在关联操作的mapper中使用参照缓存
  1. 配置
    Mapper接口和XML配置使用的是同一个命名空间。因此他们只能使用同一个缓存。

在Mapper接口中配置缓存然后在XML使用参照缓存

@CacheNarnespaceRef(RoleMapper.class) public interface RoleMapper { 
}

<!--那么在XML中只能使用参照缓存-->
<cache-ref narnespace=” tk.rnybatis.sirnple .rnapper.RoleMapper”/> 

或者可以配置XML然后Mapper接口使用参照缓存

@CacheNarnespaceRef(RoleMapper.class) public interface RoleMapper {
}

<mapper narnespace="tk.rnybatis.sirnple.rnapper.RoleMapper"> 
<cache 
eviction="FIFO" flushinterval="60000" Size="512"
readOnly="false"/>
</mapper> 
原文地址:https://www.cnblogs.com/lanqi/p/9283516.html