-
臟讀的產生
Mybatis的二級緩存是和命名空間綁定的,所以通常情況下每一個Mapper映射文件都有自己的二級緩存,不同的mapper的二級緩存互不影響。這樣的設計一不注意就會引起臟讀,從而導致數據一致性的問題。引起臟讀的操作通常發生在多表關聯操作中,比如在兩個不同的mapper中都涉及到同一個表的增刪改查操作,當其中一個mapper對這張表進行查詢操作,此時另一個mapper進行了更新操作刷新緩存,然后第一個mapper又查詢了一次,那么這次查詢出的數據是臟數據。出現臟讀的原因是他們的操作的緩存並不是同一個。 -
臟讀的避免
- mapper中的操作以單表操作為主,避免在關聯操作中使用mapper
- 在關聯操作的mapper中使用參照緩存
- 配置
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>