1. 程式人生 > 實用技巧 >Seata(TCC)+SpringCloud實現全域性事務

Seata(TCC)+SpringCloud實現全域性事務

概述

參考資料:

實現

被呼叫方

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