Transactional注解的方法中数据库和redis的回滚问题

        问题背景:如果某个方法加了Transactional注解,而这个方法中既包括mysql事务又包括redis事务,那么如何做到mysql和redis都回滚?

        mysql事务支持回滚,但redis的事务是不支持回滚的,但它俩都在当前方法的事务里面,所以,无论是mysql操作失败还是redis操作失败,都要将mysql和redis中的数据都恢复到之前的状态,以免发生数据不一致的问题。

        比如,我们有一个进行db和redis数据更新的方法dataUpdate,这个方法上我们加了Transactional注解,为了保证db和redis数据的最终一致性,我们使用了延迟双删策略,所以这个方法的逻辑是:删redis -> update db -> 删redis,为了确保不管在这三步中的哪一步执行失败了,都让db和redis回滚,我们可以这么做:

        1、定义删除redis的方法delInRedis,给此方法声明抛出异常,让它在执行失败时抛出某个类型的异常,比如我们自定义的一个异常类MyRedisOperationException,为dataUpdate方法的Transactional注解设置rollbackFor属性,让它指向MyRedisOperationException这类异常;

        2、update db这一步,如果出现了执行失败,我们要写finally语句块,在finally内部执行redis数据的重新写入,以回滚第一步对于redis的删除操作。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值