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

相关推荐
2301_783848653 分钟前
CSS解决浮动元素导致的布局闪烁_稳定容器布局高度
jvm·数据库·python
m0_740796363 分钟前
Workerman5.0协程实战:PHP高并发新标准
jvm·数据库·python
2301_769340674 分钟前
如何在 CSS 中实现元素的绝对定位,使其不受窗口尺寸变化影响
jvm·数据库·python
S1998_1997111609•X5 分钟前
超导致䗃系统固件损坏关闭进程函数洪水泛滥污染孪生镜像描述的逻辑串码缓存鸡dark and -blue 仺盀
安全·百度·缓存·哈希算法·量子计算
甄心爱学习9 分钟前
【多核平台上的并行运算】缓存映射机制
缓存
m0_7020365310 分钟前
防止SQL注入的运维实践_实时清理数据库缓存与历史记录
jvm·数据库·python
2301_7796224113 分钟前
Redis怎样合并多天访客数据_通过PFMERGE指令聚合HyperLogLog记录
jvm·数据库·python
m0_7485548113 分钟前
如何监控集群 interconnect_ping与traceroute验证心跳通畅
jvm·数据库·python
2301_7756398915 分钟前
Redis怎样查询集群的整体健康状态_使用cluster info指令查看槽位覆盖率与节点状态
jvm·数据库·python
zhoutongsheng15 分钟前
CSS如何处理带有状态切换的折叠菜单_利用BEM修饰符管理状态
jvm·数据库·python