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就可以了

  没有英汉互译结果
   请尝试网页搜索
  没有英汉互译结果
   请尝试网页搜索

转载于:https://www.cnblogs.com/jagerLan/p/10455319.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值