該樣例工程介紹 TCC 模式下補償型事務的簡單使用方法,即如何通過 GTS 保證下訂單、扣庫存兩個操作事務的一致性。

前提條件

在搭建預留型事務樣例前,需要先完成以下操作:

背景信息

TCC 模式下,GTS 允許應用介入事務的兩階段提交。補償型事務中,需要應用在第一階段做實現具體業務的操作,第二階段實現提交或者回滾操作。

樣例邏輯說明

本樣例模擬了用戶下訂單、減庫存的業務邏輯。客戶端(MTResourceCompensateClient)通過調用訂單服務(MtServiceRollin)創建訂單,之后通過調用庫存服務(MtServiceRollout)扣庫存。其中訂單服務讀寫訂單庫,庫存服務讀寫庫存數據庫,由 GTS 保證跨服務事務的一致性。

在 TCC 模式下,對于每一個業務表,需要創建一個臨時業務表用于臨時存儲業務數據。例如對于 Orders 表需要創建對應的臨時表 temp_orders,Stock 表需要創建臨時表 temp_stock,臨時表必須包含 xid 和 branchid 兩個字段。下面以庫存服務為例進行說明。

  • 在一階段,即 rollout 方法中首先將相關業務數據商品 ID(pid)和商品數據(number)插入到臨時表 temp_stock 中用于后續失敗的回滾,之后判斷庫存是否充足。如果庫存不足,直接拋出異常;如果庫存充足,執行具體扣庫存操作。
  • 第二階段,如果執行成功,只需將一階段插入到臨時表中的業務數據刪除即可;如果執行失敗,則調用回滾方法。

構建樣例工程

  1. 使用 sample-txc-mt-compensate-simpl.sql 在第一個數據庫創建 Orders 表和 temp_orders 表,在第二個數據庫創建 Stock 表和 temp_stock 表。
  2. 下載樣例 txc-yun-sample并上傳到 ECS 上。
  3. sample-txc-mt-compensate-simple /src/main/resources 路徑下打開 mt-client-context.xml 文件,修改樣例配置。
    1. 將該文件中的兩個數據源分別替換為兩個 RDS 的數據源。
    2. 將該文件中 constructor-arg value 的值替換為此前申請的 GTS 事務分組 ID。
    3. 將該文件中 accessKeysecretKey 的值修改為您實際賬號的值。
  4. 在 sample-txc-mt-compensate-simple 目錄下執行 build.sh,編譯樣例工程。

結果驗證

編譯完成后,在 sample-txc-mt-compensate-simple/client/bin 目錄下執行 run.sh,查看運行結果。