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 模式下的配置一致。

posted @ 2020-07-12 18:49  LifeOfCoding  阅读(6117)  评论(0编辑  收藏  举报