zoukankan      html  css  js  c++  java
  • Seata(TCC)+SpringCloud实现全局事务

    概述

    参考资料:

    实现

    Seata server端的配置,maven依赖等可参考 ——https://www.cnblogs.com/life-of-coding/p/13216986.html

    被调用方

    seata 的 TCC 模式全局事务,需要被调用方使用接口,并配合对应的注解来实现,接口需要定义 TCC 各个阶段需要调用的方法。

    接口需要实现的三个方法:

    • 用于业务预处理的方法,即 Try 阶段、的方法,比如冻结用户的部分余额等等;
    • 用于提交业务的方法,即 Commit 方法,比如扣除用户之前冻结的部分余额;
    • 用于回滚业务的方法,即 Rollback 方法,比如返还之前冻结的用户余额;

    被调用方需要用到的几个注解:

    • @LocalTCC (必要)
      该注解需要添加到上面描述的接口上,表示实现该接口的类被 seata 来管理,seata 根据事务的状态,自动调用我们定义的方法,如果没问题则调用 Commit 方法,否则调用 Rollback 方法。

    • @TwoPhaseBusinessAction (必要)
      该注解用在接口的 Try 方法上,该注解的用法如下:

    @TwoPhaseBusinessAction(name = "tryTcc", commitMethod = "commitTcc", rollbackMethod = "cancelTcc")
    

    该注解包含这几个属性:

    * name 为 tcc 方法的 bean 名称,需要全局唯一,一般写方法名即可;
    * commitMethod 自然地写 Commit 方法的方法名;
    * rollbackMethod 写 Rollback 方法的方法名;

    • @BusinessActionContextParameter
        该注解用来修饰 Try 方法的入参,被修饰的入参可以在 Commit 方法和 Rollback 方法中通过 BusinessActionContext 获取。
      该注解的用法如下:

      @TwoPhaseBusinessAction(name = "tryBusiness", commitMethod = "commitTcc", rollbackMethod = "cancelTcc")
      String tryBusiness (@BusinessActionContextParameter(paramName = "orderId") String id)
      

      可以使用 Map 传多个参数:

      @TwoPhaseBusinessAction(name = "tryBusiness", commitMethod = "commitTcc", rollbackMethod = "cancelTcc")
      String tryBusiness (@BusinessActionContextParameter(paramName = "params") Map<String, String> params)
      

      在接口方法的实现代码中,可以通过 BusinessActionContext 来获取参数, BusinessActionContext 就是 seata tcc 的事务上下文,用于存放 tcc 事务的一些关键数据。BusinessActionContext 对象可以直接作为 commit 方法和 rollbakc 方法的参数,Seata 会自动注入参数:

      @Override
      public boolean commitTcc(BusinessActionContext context) {
          String orderId = context.getActionContext("oderId");
          return true;
      }
      

      注意参数名要和 Try 方法里的定义保持一致。

      调用方

    调用方是通过 Feign 进行服务的调用,调用方的配置,在需要实现全局事务的方法上加上 “@GlobalTransactional” 注解即可,与 AT 模式下的配置一致。

  • 相关阅读:
    GROUP BY及GROUP BY的高阶用法
    触发器基本语法
    按标识符截取字符串 管道型函数
    delphi try except语句 和 try finally语句用法
    Qt 文件的操作
    c++ string 转double
    结构体变量的 extern 使用方法,转--
    c++ 生成dll文件并调用-转
    基2时域抽取FFT、IFFT的C++实现代码,另附DFT与IDFT的原始实现--转1
    c++ 生成dll文件并调用
  • 原文地址:https://www.cnblogs.com/life-of-coding/p/13289385.html
Copyright © 2011-2022 走看看