美文网首页方案
seata代码控制回滚和临时挂起分布式事物

seata代码控制回滚和临时挂起分布式事物

作者: huan1993 | 来源:发表于2021-09-29 09:36 被阅读0次

    一、说明

    此处只是简单的记录一下,使用了 Seata后,如何手动 回滚分布式事物和临时挂起分布式事务,Seata的整合不做详细的说明。

    二、功能实现

    1、手动回滚分布式事物

    举例:

    1. 比如我们通过feign去调用第三方服务,feign服务出现了降级。
    2. 调用第三方api,第三方api调用失败,是通过 错误吗 来告知是成功还是失败的。
    class 手动回滚分布式事物{
        public void 部分代码() {
            if (RootContext.inGlobalTransaction()) {
                try {
                    GlobalTransactionContext.reload(RootContext.getXID()).rollback();
                } catch (TransactionException e) {
                    log.error("回滚分布式事物出现异常", e);
                }
            }
        }   
    }
    

    访问请求:

     $ curl -X GET http://localhost:50017/rollbackTx\?accountId\=1\&amount\=10\&hasException\=false 
    

    结果:

    1. 当账户服务的返回值 <= 5 时,事物回滚,账户服务不扣钱,订单服务不产生订单
    2. 当账户服务的返回值 > 5 时,账户服务扣钱,订单服务产生订单

    2、临时挂起分布式事物

    举例:

    1. 在一个大的分布式事务中,如果分布式事物的某个环节出现了异常,通过 try{}catch(){}后,需要记录一个日志到数据库中,此处可能需要挂起这个分布式事务,让记录日志的方法不参与到分布式事务中。

    下方这个案例是模拟下单操作,下单分为 账户服务扣钱和产生订单,此处将账户服务扣钱操作排除到分布式事务外,产生订单参与分布式事务。

    
    class 临时挂起分布式事物 {
        
        @GlobalTransactional(rollbackFor = Exception.class)
        public void 部分代码(){
            String xid = RootContext.getXID();
            System.out.println("createAccountOrder:" + xid);
            // 解除 xid 的绑定
            RootContext.unbind();
            
            // 1、远程扣减账户余额
            // =============== 此方法不在分布式事务中=================
            boolean debitResult = remoteDebit(accountId, amount);
            // =============== 此方法不在分布式事务中=================
            
            // 重新绑定 xid
            RootContext.bind(xid);
            // 2、下订单
            orderService.createOrder(accountId, amount);
            // 抛出异常
            int i = 1 / 0;
        }
    }
    

    访问请求:

     $ curl -X GET http://localhost:50017/bindAndUnBind\?accountId\=1\&amount\=10\&hasException\=false 
    

    结果: 账户服务扣钱,没有产生订单

    三、完整代码

    https://gitee.com/huan1993/spring-cloud-parent/tree/master/seata/seata-springboot-rollback-tx

    四 参考链接

    http://seata.io/zh-cn/blog/seata-spring-boot-aop-aspectj.html

    相关文章

      网友评论

        本文标题:seata代码控制回滚和临时挂起分布式事物

        本文链接:https://www.haomeiwen.com/subject/awadnltx.html