[mybatis] 脏数据

 

脏数据的产生原因

产生原因?

  1. 修改数据没有更新。

  2. Mybatis的二级缓存是和命名空间绑定的,所以通常情况下每一个Mapper映射文件都拥有自己的二级缓存,不同的二级缓存互不影响。
    但在常见的数据库操作中,多表联合查询非常常见,由于关系型数据库的设计,使得很多时候需要关联多个表才能获得想要的数据。在关联多表查询时肯定会将该查询放到某个命名空间下的映射文件中,这样一个多表的查询就会缓存在该命名空间的二级缓存中欧给你。
    涉及这些表的增、删、改的操作通常不在一个映射文件中,他们的命名空间不同,因此当有数据变化时,多表查询的缓存未必会被清空,就产生了脏数据。

如何避免?

  1. 为了读写安全,如果有对数据进行改写,应更新数据,更新后会清空一、二级缓存,这样就不会导致后续获取到的缓存数据为脏数据。避免缓存和数据库数据不一致。
  2. 用参照缓存。当某几个表可以作为一个业务整体时,通常是让几个会关联的表同时使用一个二级缓存,这样就能解决脏数据问题。(如下)
<mapper namespace="com.demo.mapper.UserMapper">
    <cache-ref type="com.demo.mapper.RoleMapper" />
</mapper>

UserMapper的映射参照了RoleMapper。当role表有变动时,后续不使用二级缓存,而是重新从数据库中获取数据。

但并不是所有关联查询都可以这么解决,如果有几十个表以不同的关联关系存在于各自的映射文件中时,使用参照缓存没有意义。