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的删除操作。

相关推荐
l1t22 分钟前
DeepSeek辅助总结的测试PostgreSQL数据库插入性能方法
数据库·postgresql
赫萝的红苹果28 分钟前
实验探究并验证MySQL innoDB中的各种锁机制及作用范围
android·数据库·mysql
霖霖总总1 小时前
[小技巧45]MySQL Undo Log解析:Undo Log分类与存储机制
数据库·mysql
曾经的三心草1 小时前
Redis-1-基础操作
数据库·redis·缓存
电商API&Tina2 小时前
Python请求淘宝商品评论API接口全指南||taobao评论API
java·开发语言·数据库·python·json·php
小北方城市网2 小时前
Redis 分布式锁与缓存三大问题解决方案
spring boot·redis·分布式·后端·缓存·wpf·mybatis
十六年开源服务商3 小时前
外贸WordPress用户反馈分析与运营维护
运维·服务器·数据库
·云扬·3 小时前
深入理解MySQL事务:ACID特性、隔离级别与MVCC原理
数据库·mysql·oracle
90的程序爱好者3 小时前
Kettle多张表数据抽取操作步骤
数据库·数据仓库·数据挖掘