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 小时前
完美解决:应用版本更新,增加字段导致 Redis 旧数据反序列化报错
redis·spring·bootstrap
Jayyih3 小时前
嵌入式系统学习Day35(sqlite3数据库)
数据库·学习·sqlite
EkihzniY4 小时前
OCR 识别表现好坏离不开什么?
缓存
小熊h4 小时前
redis 集群——redis cluster(去中心化)
redis·去中心化
得意霄尽欢5 小时前
Redis之底层数据结构
数据结构·数据库·redis
hsjkdhs5 小时前
MySQL 数据类型与运算符详解
数据库·mysql
吐泡泡_6 小时前
Redis(集群)
redis
爱吃烤鸡翅的酸菜鱼7 小时前
【Redis】常用数据结构之Hash篇:从常用命令到使用场景详解
数据结构·数据库·redis·后端·缓存·哈希算法
Pretend° Ω7 小时前
LRU缓存详解:用C语言实现高效数据管理
运维·c语言·spring·缓存·lru·双向链表
李少兄7 小时前
IntelliJ IDEA 启动项目时配置端口指南
数据库·sql·intellij-idea