请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

修改数据时 双写一致性?

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;
    }

比如:

  1. 线程A从数据库中删除了一条记录。
  2. 在线程A还没有来得及删除缓存之前,线程B查询这条记录。
  3. 等待线程A操作完成后尝试读取缓存,由于线程A还没有删除缓存,线程B读取到了旧的缓存数据。
  4. 线程B返回了旧的数据
  5. 线程A删除了缓存中的数据,但此时线程B及其他线程可能已经使用了旧数据。

正在回答 回答被采纳积分+3

2回答

RubinChu 2023-11-08 15:32:43

可以的哈,延时双删可以解决大部分的不一致场景,我们这里只要不涉及多端登录,所以没有做到那么细的力度哈,同学能想到这一点还是很棒的

0 回复 有任何疑惑可以回复我~
  • 提问者 精慕门2479394 #1
    谢谢老师解答, 但还是有点疑惑,假设不涉及多端登录: 
    1、分享的创建者发起删除操作,分享记录从数据库中删除。
    2、其他用户在缓存删除之前查询分享的简单详情。(查询分享的简单详情)
    3、这些用户从缓存中读取了已经被删除的分享的简单详情。
    4、最后分享创建者将缓存中的分享记录被删除
    
    请问是否会出现这个情况呢?
    回复 有任何疑惑可以回复我~ 2023-11-09 10:29:14
  • RubinChu 回复 提问者 精慕门2479394 #2
    可能的哈,不过这种延时我们是可以接受的,因为查询分享的人后面保存到我的网盘还是刷新一下,都会提示失效的哈
    回复 有任何疑惑可以回复我~ 2023-11-09 10:32:17
  • 提问者 精慕门2479394 回复 RubinChu #3
    谢谢rubin老师 明白了
    回复 有任何疑惑可以回复我~ 2023-11-09 10:33:17
提问者 精慕门2479394 2023-11-08 14:27:37

请问这里为什么没有使用 延迟双删 呢

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信