該樣例工程介紹 TCC 模式下補償型事務的簡單使用方法,即如何通過 GTS 保證下訂單、扣庫存兩個操作事務的一致性。
前提條件
- 開通 GTS(創(chuàng)建事務分組)。
- 準備兩個 RDS 實例和一個 ECS 實例,用于部署本應用。
背景信息
樣例邏輯說明
本樣例模擬了用戶下訂單、減庫存的業(yè)務邏輯。客戶端(MTResourceCompensateClient)通過調用訂單服務(MtServiceRollin)創(chuàng)建訂單,之后通過調用庫存服務(MtServiceRollout)扣庫存。其中訂單服務讀寫訂單庫,庫存服務讀寫庫存數據庫,由 GTS 保證跨服務事務的一致性。
在 TCC 模式下,對于每一個業(yè)務表,需要創(chuàng)建一個臨時業(yè)務表用于臨時存儲業(yè)務數據。例如對于 Orders 表需要創(chuàng)建對應的臨時表 temp_orders,Stock 表需要創(chuàng)建臨時表 temp_stock,臨時表必須包含 xid 和 branchid 兩個字段。下面以庫存服務為例進行說明。
- 在一階段,即 rollout 方法中首先將相關業(yè)務數據商品 ID(pid)和商品數據(number)插入到臨時表 temp_stock 中用于后續(xù)失敗的回滾,之后判斷庫存是否充足。如果庫存不足,直接拋出異常;如果庫存充足,執(zhí)行具體扣庫存操作。
- 第二階段,如果執(zhí)行成功,只需將一階段插入到臨時表中的業(yè)務數據刪除即可;如果執(zhí)行失敗,則調用回滾方法。
構建樣例工程
- 使用 sample-txc-mt-compensate-simpl.sql 在第一個數據庫創(chuàng)建 Orders 表和 temp_orders 表,在第二個數據庫創(chuàng)建 Stock 表和 temp_stock 表。
- 下載樣例 txc-yun-sample并上傳到 ECS 上。
- 在 sample-txc-mt-compensate-simple /src/main/resources 路徑下打開 mt-client-context.xml 文件,修改樣例配置。
- 將該文件中的兩個數據源分別替換為兩個 RDS 的數據源。
- 將該文件中 constructor-arg value 的值替換為此前申請的 GTS 事務分組 ID。
- 將該文件中 accessKey 和 secretKey 的值修改為您實際賬號的值。
- 在 sample-txc-mt-compensate-simple 目錄下執(zhí)行 build.sh,編譯樣例工程。
結果驗證
編譯完成后,在 sample-txc-mt-compensate-simple/client/bin 目錄下執(zhí)行 run.sh,查看運行結果。