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(),但在我的项目中使用这个方法无法回滚,目前没找到原因

补充:

以上是LCN4.0版本的解决方案,LCN5.0之后的api有较大改动,LCN5.0更新之后功能强大了许多

附上5.0手动回滚事务的解决方案:

//int res = mqTxManagerService.notifyGroup(TxContext.current().getGroupId(),TxTransactionLocal.current().getKid());
DTXUserControls.rollbackCurrentGroup();    //只需换一下回滚API就可以了

  没有英汉互译结果
  请尝试网页搜索
  没有英汉互译结果
  请尝试网页搜索
posted @ 2019-03-01 11:20  丰兰月  阅读(1549)  评论(0编辑  收藏  举报