1. 程式人生 > >分散式事務之TCC

分散式事務之TCC

TCC本質上也是一種二階段協議,不同在於TCC需要與具體業務耦合,下面首先看下TCC步驟:
所有事務參與方都需要實現try,confirm,cancle介面。
事務發起方向事務協調器發起事務請求,事務協調器呼叫所有事務參與者的try方法完成資源的預留,這時候並沒有真正執行業務,而是為後面具體要執行的業務預留資源,這裡完成了一階段。
如果事務協調器發現有參與者的try方法預留資源時候發現資源不夠,則呼叫參與方的cancle方法回滾預留的資源,需要注意cancle方法需要實現業務冪等,因為有可能呼叫失敗(比如網路原因參與者接受到了請求,但是由於網路原因事務協調器沒有接受到回執)會重試。
如果事務協調器發現所有參與者的try方法返回都OK,則事務協調器呼叫所有參與者的confirm方法,不做資源檢查,直接進行具體的業務操作。
如果協調器發現所有參與者的confirm方法都OK了,則分散式事務結束。
如果協調器發現有些參與者的confirm方法失敗了,或者由於網路原因沒有收到回執,則協調器會進行重試。這裡如果重試一定次數後還是失敗,會怎麼樣那?常見的是做事務補償。

這裡寫圖片描述

對於TCC的解釋:
Try階段:嘗試執行,完成所有業務檢查(一致性),預留必須業務資源(準隔離性)
Confirm階段:確認執行真正執行業務,不作任何業務檢查,只使用Try階段預留的業務資源,Confirm操作滿足冪等性。要求具備冪等設計,Confirm失敗後需要進行重試。
Cancel階段:取消執行,釋放Try階段預留的業務資源
Cancel操作滿足冪等性Cancel階段的異常和Confirm階段異常處理方案基本上一致。

螞蟻金服基於TCC實現了XTS(雲上叫DTS),目前在螞蟻金服雲上有對外輸出,這裡我們來結合其提供的一個例子來具體理解TCC的含義,以下引入螞蟻金服雲實例:

“首先我們假想這樣一種場景:轉賬服務,從銀行 A 某個賬戶轉 100 元錢到銀行 B 的某個賬戶,銀行 A 和銀行 B 可以認為是兩個單獨的系統,也就是兩套單獨的資料庫。

我們將賬戶系統簡化成只有賬戶和餘額 2 個欄位,並且為了適應 DTS 的兩階段設計要求,業務上又增加了一個凍結金額(凍結金額是指在一筆轉賬期間,在一階段的時候使用該欄位臨時儲存轉賬金額,該轉賬額度不能被使用,只有等這筆分散式事務全部提交成功時,才會真正的計入可用餘額)。按這樣的設計,使用者的可用餘額等於賬戶餘額減去凍結金額。這點是理解參與者設計的關鍵,也是 DTS 保證最終一致的業務約束。”

在try階段並沒有對銀行A和B資料庫中的餘額欄位做操作,而是對凍結金額做的操作,對應A銀行預留資源操作是對凍結金額加上100元,這時候A銀行賬號上可用錢為餘額欄位-凍結金額;對應B銀行的操作是對凍結金額上減去100,這時候B銀行賬號上可用的錢為餘額欄位-凍結金額。

如果事務協調器呼叫銀行A和銀行B的try方法有一個失敗了(比如銀行A的賬戶餘額不夠了),則呼叫cancle進行回滾操作(具體是對凍結金額做反向操作)。如果呼叫try方法都OK了,則進入confirm階段,confirm階段則不做資源檢查,直接做業務操作,對應銀行A要在賬戶餘額減去100,然後凍金額減去100;對應銀行B要對賬戶餘額欄位加上100,然後凍結金額加上100。

最關心的,如果confirm階段如果有一個參與者失敗了,該如何處理,其實上面操作都是xts-client做的,還有一個xts-server專門做事務補償的。

相關推薦

分散式事務——tcc-transaction分散式TCC事務框架搭建與實戰案例【轉】

一、背景 有一定分散式開發經驗的朋友都知道,產品/專案/系統最初為了能夠快速迭代上線,往往不太注重產品/專案/系統的高可靠性、高效能與高擴充套件性,採用單體應用和單例項資料庫的架構方式快速迭代開發;當產品/專案/系統做到一定規模的時候,原有的系統架構則不足以支撐義務發展需要,往往相同的業務則需要

【轉】分散式事務TCC服務設計和實現注意事項

1、TCC簡介 TCC是一種比較成熟的分散式事務解決方案,可用於解決跨庫操作的資料一致性問題; TCC是服務化的兩階段程式設計模型,其Try、Confirm、Cancel 3個方法均由業務編碼實現; 其中Try操作作為一階段,負責資源的檢查和預留,Confirm操作作為二階段提交操作,執行真正的業務,C

分散式事務TCC

TCC本質上也是一種二階段協議,不同在於TCC需要與具體業務耦合,下面首先看下TCC步驟: 所有事務參與方都需要實現try,confirm,cancle介面。 事務發起方向事務協調器發起事務請求,事務協調器呼叫所有事務參與者的try方法完成資源的預留,這時候

分散式事務TCC與XA

TCC與XA/JTA對比 XA是資源層面的分散式事務,強一致性,在兩階段提交的整個過程中,一直會持有資源的鎖。基於資料庫鎖實現。 TCC是業務層面的分散式事務,最終一致性,不會一直持有資源的鎖。(第

Dubbo學習系列十五(Seata分散式事務方案TCC模式)

上篇的續集。 工具: Idea201902/JDK11/Gradle5.6.2/Mysql8.0.11/Lombok0.27/Postman7.5.0/SpringBoot2.1.9/Nacos1.1.3/Seata0.8.1/SeataServer0.8.1/Dubbo2.7.3 難度:新手--戰士--老兵

微服務分散式事務LCN、TCC

在[億級流量架構之分散式事務解決方案對比](https://www.cnblogs.com/Courage129/p/14443653.html)中, 已經簡單闡明瞭從本機事務到分散式事務的演變過程, 文章的最後簡單說明了TCC事務, 這兒將會深入瞭解TCC事務是原理, 以及理論支援, 最後會用Demo舉例實

分散式事務MQ可靠訊息

使用MQ可靠訊息能夠解決分散式事務的最終一致性,但不是實時一致(強一致性)。所以使用時要注意應用場景。 MQ可靠訊息: 1.預發訊息:MQ傳送訊息之前把訊息的資訊先存到資料庫中留底,設定一個欄位狀態為待確認。(作用:能夠知道這條訊息是否傳送成功,可進行人工補償) 2.進行業務操作 3

分散式事務Hmily TCC原始碼--學習整合

一、什麼是分散式事務 分散式事務是指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點上, 本質上來說,分散式事務是為了保證不同資料庫的資料一致性 TCC事務主要是基於AOP切面攔截實現的三階段提交事務,下面我們來跟讀原始碼====> hmily,這原本是

分散式事務——基於訊息中介軟體實現

 環境需求:假如某人有5個女朋友(有點複雜),每天晚上都會給他的女朋友打電話說晚安,那麼每給一個女朋友打電話,其他女朋友都要進入等待狀態。一個一個打下去。。。等打到最後一個已經是凌晨了,對方都睡了。那麼有什麼辦法可以解決呢?此時這個人可以利用微信公眾號將自己甜言蜜語放進公眾號

分散式事務Hmily TCC原始碼跟讀記錄

一、什麼是分散式事務 分散式事務是指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點上, 本質上來說,分散式事務是為了保證不同資料庫的資料一致性 TCC事務主要是基於AOP切面攔截實現的三階段提交事務,下面我們來跟讀原始碼

分散式事務本地訊息表

什麼是分散式事務 分散式事務就是指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上。簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分佈在不同的伺服器上,且屬於不同的應用,分散式事務需要保證這些小操作要麼全部成功,要麼全部失敗。本質上來說,分散式事務就

分散式事務可靠訊息

什麼是可靠訊息? 為什麼我們需要它,為什麼我們要強調可靠? 生產方 訊息傳送出去了,如果生產方收到了訊息的正常反饋,那麼我們就可以知道訊息的確切的狀態。 如果訊息無響應 或者超時了呢? 有多個情況, 1 訊息未到達mq,傳送途中 就某些原因丟失了, 2 訊息送達mq,但是mq處理未完成就丟失(這裡又可

分散式事務——MySQL對XA事務的支援

 MySQL 從5.0.3開始支援XA分散式事務,且只有InnoDB儲存引擎支援。MySQL Connector/J 從5.0.0版本之後開始直接提供對XA的支援。 需要注意的是, 在DTP模型中,mysql屬於資源管理器(RM)。而一個完整的分散式事務中,一般會存在多個RM

分散式事務最終一致的Mq實現

問題的起源 分散式系統的特性 對分散式系統有過研究的讀者,可能聽說過“CAP定律”、“Base理論”等,非常巧的是,化學理論中ACID是酸、Base恰好是鹼。這裡我們不對這些概念做過多的解釋,有興趣的讀者可以檢視相關參考資料。 這裡針對一致性我

跟我學分散式事務2PC和3PC

分散式一致性回顧 在分散式系統中,為了保證資料的高可用,通常,我們會將資料保留多個副本(replica),這些副本會放置在不同的物理的機器上。為了對使用者提供正確的增\刪\改\差等語義,我們需要保證這些放置在不同物理機器上的副本是一致的。 為了解決這種分散式一致性問題

分散式事物TCC柔性事物

分散式事務之說說TCC事務        在當前如火如荼的網際網路浪潮下,如何應對海量資料、高併發成為大家面臨的普遍難題。廣大IT公司從以往的集中式網站架構,紛紛轉向分散式的網站架構,隨之而來的就是進行資料庫拆分和應用拆分,如何在跨資料庫、跨應用保證資料操作和業務操作的一致性

終於跑通分散式事務框架tcc-transaction的示例專案

1、背景 前段時間在看專案程式碼的時候,發現有些介面的流程比較長,在各個服務裡面都有通過資料庫事務保證資料的一致性,但是在上游的controller層並沒有對一致性做保證。 網上查了下,還沒找到基於Go開源的比較成熟的分散式事務框架。 於是,準備看看之前隔壁部門大佬寫的tcc-transaction,這

Spring Cloud Alibaba | 微服務分散式事務Seata

Spring Cloud Alibaba | 微服務分散式事務之Seata 本篇實戰所使用Spring有關版本: SpringBoot:2.1.7.RELEASE Spring Cloud:Greenwich.SR2 Spring CLoud Alibaba:2.1.0.RELEASE 1. 概述 在構建

分散式事務那些事兒TCC

一、TCC簡介 TCC是一種比較成熟的分散式事務解決方案,可用於解決跨庫操作的資料一致性問題; TCC是服務化的兩階段程式設計模型,其Try、Confirm、Cancel 3個方法均由業務編碼實現; 其中Try操作作為一階段,負責資源的檢查和預留,Confirm操作作為二階段提交操作,執

如何實現一個TCC分散式事務框架的一點思考

一個TCC事務框架需要解決的當然是分散式事務的管理。關於TCC事務機制的介紹,可以參考TCC事務機制簡介。 TCC事務模型雖然說起來簡單,然而要基於TCC實現一個通用的分散式事務框架,卻比它看上去要複雜的多,不只是簡單的呼叫一下Confirm/Cancel業務就可以了的。 本文將以Spring容器為例,試圖