AOP实现LCN手动回滚事务
Posted jagerlan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP实现LCN手动回滚事务相关的知识,希望对你有一定的参考价值。
许多用LCN作为分布式事务解决方案的同学可能会遇到一个问题。当分布式事务中的子事务自己try catch了异常的时候,异常并没有抛出来,而不抛出异常,则LCN不会执行回滚操作
这种情况其实挺常见的,比如:一个订单系统,在下单的时候可能会涉及到优惠券、积分、权益的使用,而如果优惠券、积分、权益分别由不同开发人员开发,他们各自有自己的开发习惯,其中一个人就习惯自己处理异常,然后返回一个错误码,又或者有些公司的代码规则是需要自己处理异常的。这种情况,就不能依靠异常来让LCN回滚事务。
那这时候怎么办呢?
其实LCN已经给出了手动回滚的接口。而我们要做的其实就是在合适的时机调用这个接口,Spring给我们提供了一个非常好的时机,AOP。
下面直接贴代码了:
@Aspect @Component public class TxAspect { private static final Logger logger = LoggerFactory.getLogger(TxAspect.class); @Autowired MQTxManagerService mqTxManagerService; @Pointcut("@annotation(com.codingapi.tx.annotation.TxTransaction)") //只需拦截使用了LCN注解的方法 public void txAnnotation(){ } @AfterReturning(returning = "ret", pointcut = "txAnnotation()") public void doAfterReturning(JoinPoint joinPoint,Object ret) { ResultBeans resultBeans = (ResultBeans)ret; //获取到方法的返回值,相信大家同一个项目的方法的返回值类型应该能统一 if (resultBeans.getCode()!=1001){ //定义成功的code,根据这个code来判断需不需要回滚 logger.info("LCN手动回滚事务"); int res = mqTxManagerService.cleanNotifyTransaction(TxTransactionLocal.current().getGroupId(),TxTransactionLocal.current().getKid()); //调用LCN的接口实现事务回滚 } } }
这里插一句,之前本人也搜过博客,有博客上使用的回滚方法是mqTxManagerService.closeTransactionGroup(),但在我的项目中使用这个方法无法回滚,目前没找到原因
以上就是本人的项目使用LCN的小小经验,有不同见解的欢迎指出交流
以上是关于AOP实现LCN手动回滚事务的主要内容,如果未能解决你的问题,请参考以下文章