建设网站报价表,建网站报价明细表,api接口开放平台,企业短视频推广问题背景#xff1a;如果某个方法加了Transactional注解#xff0c;而这个方法中既包括mysql事务又包括redis事务#xff0c;那么如何做到mysql和redis都回滚#xff1f; mysql事务支持回滚#xff0c;但redis的事务是不支持回滚的#xff0c;但它俩都在当前方法的事务里… 问题背景如果某个方法加了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的删除操作。