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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM