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

相关推荐
妙码生花7 分钟前
从 PHP 到 AI + Golang,程序员自救转型手记(三十二):增加 admin_rule 模型及数据表迁移
数据库·go·ai编程
千维百策6661 小时前
SRE 中如何消除琐务:提升工程效率与服务可靠性的实践方法
数据库
卓怡学长1 小时前
w266基于spring boot + vue 圣地延安美食乐享系统
java·数据库·vue.js·spring boot·spring·intellij-idea
名不经传的养虾人2 小时前
从0到1:企业级AI项目迭代日记 Vol.65|最危险的故障不是崩溃,是悄悄换掉了正确答案
数据库·人工智能·ai编程·ai-agent·企业ai
程序员佳佳2 小时前
模型网关灰度不是调百分比:把放量、观测和回滚做成账本
java·数据库·人工智能·redis·gpt·aigc·embedding
绩隐金2 小时前
用AI开了本小说 九折归潮
数据库
heimeiyingwang2 小时前
【架构实战】MySQL索引优化:从慢查询到毫秒响应
数据库·mysql·架构
得闲喝茶2 小时前
跨表数据匹配——VLOOKUP、XLOOKUP
大数据·数据库·笔记·信息可视化·数据分析·excel
snow@li2 小时前
数据库:如何设计最佳索引 / 数据库最佳索引设计指南
数据库
渣渣灰飞3 小时前
MySQL 系统学习 第二阶段 第四章:DCL(Data Control Language)第二节:权限管理与角色(Role)
数据库·学习·mysql