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手动回滚事务的主要内容,如果未能解决你的问题,请参考以下文章

spring全注解事务管理中怎么手动回滚事物

分布式事务LCN原理

分布式事务解决方案框架(LCN)

分布式事务介绍和事务框架LCN,seata介绍

springmvc +mybatis实现手动让事务回滚

Spring——事务管理