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 分钟前
MySQL分区实战指南:从原理到落地的完整攻略
数据库·mysql
雨墨✘4 分钟前
PHP怎么执行Shell命令_exec与shell_exec区别说明【说明】
jvm·数据库·python
Trouvaille ~11 分钟前
【MySQL篇】复合查询:多表数据的整合
数据库·sql·mysql·面试·复合查询·基础入门·多表连接
Project_Observer12 分钟前
列表视图中的筛选列
大数据·数据库·深度学习·机器学习·深度优先
bukeyiwanshui21 分钟前
20260414 正则表达式及shell三剑客
数据库·mysql·正则表达式
cyber_两只龙宝21 分钟前
【Oracle】Oracle之SQL中的单行函数
linux·运维·数据库·sql·云原生·oracle
2201_7568473325 分钟前
mysql字段长度不够用了怎么办_使用alter table扩大varchar长度
jvm·数据库·python
aq553560033 分钟前
Laravel4.x革命性升级:现代PHP开发新纪元
数据库·oracle
Trouvaille ~1 小时前
【MySQL篇】内外连接:多表关联的完整指南
android·数据库·mysql·面试·后端开发·dql·内外连接
KKKlucifer1 小时前
三权分立 + AI 审计:解析国内堡垒机的合规与智能双引擎
大数据·数据库·人工智能