脏数据的产生和避免

二级缓存虽然能提高应用效率,减轻数据库服务器的压力,但是如果使用不当,很容易产生脏数据。这些脏数据会在不知不觉中影响业务逻辑,影响应用的实效,所以我们需要了解在 MyBatis 缓存中脏数据是如何产生的,也要掌握避免脏数据的技巧。

MyBatis 的二级缓存是和命名空间绑定的,所以通常情况下每一个 Mapper 映射文件都拥有自己的二级缓存,不同 Mapper 的二级缓存互不影响

在常见的数据库操作中,多表联合查询非常常见,由于关系型数据库的设计,使得很多时候需要关联多个表才能获得想要的数据。在关联多表查询时肯定会将该查询放到某个命名空间下的映射文件中,这样一个多表的查询就会缓存在该命名空间的二级缓存中涉及这些表的增、删、改操作通常不在一个映射文件中,它们的命名空间不同,因此当有数据变化时,多表查询的缓存未必会被清空,这种情况下就会产生脏数据

该如何避免脏数据的出现呢?

这时就需要用到参照缓存了。当某几个表可以作为一个业务整体时,通常是让几个会关联的表同时使用同一个二级缓存,这样就能解决脏数据问题,即这几个表通过参照缓存指向同一个 namespace。

虽然这样可以解决脏数据的问题,但是并不是所有的关联查询都可以这么解决,如果有几十个表甚至所有表都以不同的关联关系存在于各自的映射文件中时,使用参照缓存显然没有意义。在无法保证数据不出现脏读的情况下,建议在业务层使用可控制的缓存代替二级缓存。

Last updated