分佈式事務解決方案 -- TCC 筆記

TCC 一種成熟的分佈式事務解決方案,可用於解決跨庫操做的數據一致性問題。
TCC 是 Try - Confirm - Cancel 縮寫,TCC 事務與傳統的數據庫事務不一樣,它存在於業務層面,由系統業務邏輯(事務管理器),進行事務控制。html

TCC 將原業務服務,拆分爲了三個操做。可將這三個操做,對應想象成三個方法,每一個方法裏有不一樣的業務代碼。git

  1. Try:檢查預留資源
  2. Confirm:業務執行
  3. Cancel:回撤 Try 裏執行的操做

image

Try

在 TCC 中,這是一個初步操做,從業務邏輯上來講,這只是檢查資源(數據是否正確或業務上是否可執行等)的操做,真正執行實際業務更改是在 Confirm 中。也就是說,Try 操做事後,與後續執行的 Confirm 操做一塊兒(Try - Confirm),才真正構成一個完整的業務邏輯。但若是 Try 操做出現異常,則會執行 Cancel 操做。(Try - Cancel)。
TCC服務須要保證Try操做成功以後,Confirm操做必定能成功。github

Confirm

是對 Try 操做的一個補充。當 TCC事務管理器 決定 commit 全局事務時,就會逐個執行 Try 操做指定的 Confirm 操做,將 Try 未完成的事項最終完成。sql

Cancel

是對 Try 操做的一個回撤。當 TCC 事務管理器決定 rollback 全局事務時,就會逐個執行 Try 操做指定的 Cancel 操做,將 Try 操做已完成的事項所有撤回。數據庫

執行流程圖

image

異常處理

TCC 須要注意三種異常處理分別是冪等、空回滾、資源懸掛網絡

冪等

問題描述併發

網絡數據包重複傳輸,或者異常事務的補償執行,會致使 TCC 服務的 Try、Confirm或者Cancel操做被重複執行。分佈式

解決思路學習

建立事務控制表,記錄事務當前執行的狀態,每次執行前都查詢該狀態。設計

空回滾

問題描述

空回滾指的是 Try 未執行,Cancel 執行。

結合 TCC執行流程圖 來講:

  1. 當業務應用運行至 2 調用 Try 操做 中,服務A Try 操做裏的代碼發起請求,等待 服務B Try 操做結果
  2. 但 服務B 此時因網絡緣由,沒法接收 Try 操做被請求調用
  3. 此時,業務系統中的事務協調器發現 服務A 的 Try 操做遲遲未響應,認爲操做失敗;則會去調用 服務A 的 Cancel 操做,去回撤 Try 操做
  4. 同時也會去調用 服務B 的 Cancel 操做,去回撤 服務B 的 Try 操做。若是此時 服務B 網絡正常,則會去執行 Cancel 操做。因而發生了 Try 未執行,Cancel 執行。

解決思路

咱們是容許空回滾的產生的,因此咱們須要在 Cancel 操做中,識別出 Try 操做是否執行。而如何識別呢?
在事務控制表中,每一個服務的 Try 操做是否執行,都應有對應記錄。因此可在 Cancel 操做中去讀取對應服務的 Try 執行記錄,來判斷是否執行過 Try 操做,從而判斷出本次是否爲空回滾,不釋聽任何資源。

資源懸掛

問題描述

Cancel 比 Try 先執行。

接着空回滾流程來講:

  1. 當 服務B 執行完 Cancel 操做以後,先前 服務A 發起未抵達 服務B 的請求,被服務B接收
  2. 服務B 執行 Try 操做。因而發生了 Cancel 比 Try 先執行。

但事務協調器已經調用了 服務B 的 Cancel 操做,而且 服務B 也成功執行了 Cancel 操做。此時 服務B 中 Try 操做改變的資源將得不到 Confirm 的確認執行,或者 Cancel 回撤執行。這部分資源稱爲資源懸掛。

解決思路

在發生空回滾的場景下,事務控制表 記錄已發生的 Cancel 控制記錄,在調用 Try 時,判斷是否存在此記錄。

業務數據可見性控制

TCC服務的一階段Try操做會作資源的預留,在二階段操做執行以前,若是其餘事務須要讀取被預留的資源數據,那麼處於中間狀態的業務數據該如何向用戶展現,須要業務在實現時考慮清楚;一般的設計原則是 「寧肯不展現、少展現,也很少展現、錯展現」。

業務數據併發訪問控制

TCC服務的一階段Try操做預留資源以後,在二階段操做執行以前,預留的資源都不會被釋放;若是此時其餘分佈式事務修改這些業務資源,會出現分佈式事務的併發問題;
在實現TCC服務時,須要考慮業務數據的併發控制,儘可能將邏輯鎖粒度降到最低,以最大限度的提升分佈式事務的併發性。

https://houbb.github.io/2018/09/02/sql-distribute-transaction-tcc
http://lingo0.github.io/2018/10/15/TCC-transaction學習/
http://www.javashuo.com/article/p-tqveayzw-bg.html
https://cloud.tencent.com/developer/article/1786144
https://zhuanlan.zhihu.com/p/39575038

相關文章
相關標籤/搜索