修改数据时 双写一致性?
来源:10-4 项目引入缓存的抽象实现_Sub_01

精慕门2479394
2023-11-08
rubin老师 有个疑问,手动实现缓存中 有关数据修改的方法 updateById removeById 都是 先修改数据库中的数据,然后再删除缓存,这个好像不能保证缓存和数据库的数据一致? 这个地方为什么不使用“延迟双删”呢
@Override
public boolean updateById(Serializable id, V entity) {
int rowNum = getBaseMapper().updateById(entity);
//根据ID来更新数据库中的数据时,同时也删除对应的缓存数据,以确保缓存与数据库保持一致
removeCache(id);
return rowNum == 1;
}
@Override
public boolean removeById(Serializable id) {
int rowNum = getBaseMapper().deleteById(id);
removeCache(id);
return rowNum == 1;
}
比如:
- 线程A从数据库中删除了一条记录。
- 在线程A还没有来得及删除缓存之前,线程B查询这条记录。
- 等待线程A操作完成后尝试读取缓存,由于线程A还没有删除缓存,线程B读取到了旧的缓存数据。
- 线程B返回了旧的数据
- 线程A删除了缓存中的数据,但此时线程B及其他线程可能已经使用了旧数据。
写回答
2回答
-
RubinChu
2023-11-08
可以的哈,延时双删可以解决大部分的不一致场景,我们这里只要不涉及多端登录,所以没有做到那么细的力度哈,同学能想到这一点还是很棒的
032023-11-09 -
精慕门2479394
提问者
2023-11-08
请问这里为什么没有使用 延迟双删 呢
00
相似问题
缓存性能测试
回答 1
关于修改密码模块的问题
回答 1