91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解分布式事務

發布時間:2021-10-20 10:10:02 來源:億速云 閱讀:171 作者:iii 欄目:web開發

本篇內容主要講解“如何理解分布式事務”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何理解分布式事務”吧!

事務

要說分布式事務,首先還是從事務的基本特征說起。

A原子性:在事務的執行過程中,要么全部執行成功,要么都不成功。

C一致性:事務在執行前后,不能破壞數據的完整性。一致性更多的說的是通過AID來達到目的,數據應該符合預先的定義和約束,由應用層面來保證,還有的說法是C是強行為了ACID湊出來的。

I隔離性:多個事務之間是互相隔離的,事務之間不能互相干擾,涉及到不同事務的隔離級別的問題。

D持久性:一旦事務提交,數據庫中數據的狀態就應該是永久性的。

XA

XA(eXtended Architecture)是指由X/Open  組織提出的分布式事務處理的規范,他是一個規范或者說是協議,定義了事務管理器TM(Transaction Manager),資源管理器RM(Resource  Manager),和應用程序。

事務管理器TM就是事務的協調者,資源管理器RM可以認為就是一個數據庫。

如何理解分布式事務

2PC

XA定義了規范,那么2PC和3PC就是他的具體實現方式。

2PC叫做二階段提交,分為投票階段和執行階段兩個階段。

投票階段

TM向所有的參與者發送prepare請求,詢問是否可以執行事務,等待各個參與者的響應。

這個階段可以認為只是執行了事務的SQL語句,但是還沒有提交。

如果都執行成功了就返回YES,否則返回NO。

如何理解分布式事務

執行階段

執行階段就是真正的事務提交的階段,但是要考慮到失敗的情況。

如果所有的參與者都返回YES,那么就執行發送commit命令,參與者收到之后執行提交事務。

反之,只要有任意一個參與者返回的是NO的話,就發送rollback命令,然后執行回滾的操作。

如何理解分布式事務

2PC的缺陷

  1. 同步阻塞,可以看到,在執行事務的過程當中,所有數據庫的資源都被鎖定,如果這時候有其他人來訪問這些資源,將會被阻塞,這是一個很大的性能問題。

  2. TM單點問題,只要一個TM,一旦TM宕機,那么整個流程無法繼續完成。

  3. 數據不一致,如果在執行階段,參與者腦裂或者其他故障導致沒有收到commit請求,部分提交事務,部分未提交,那么數據不一致的問題就產生了。

3PC

既然2PC有這么多問題,所以就衍生出了3PC的概念,也叫做三階段提交,他把整個流程分成了CanCommit、PreCommit、DoCommit三個步驟,相比2PC,增加的就是CanCommit階段。

CanCommit

這個階段就是先詢問數據庫是否執行事務,發送一個canCommit的請求去詢問,如果可以的話就返回YES,反之返回NO。

如何理解分布式事務

PreCommit

這個階段就等同于2PC的投票階段了,發送preCommit命令,然后去執行SQL事務,成功就返回YES,反之返回NO。

如何理解分布式事務

但是,這個地方的區別在于參與者有了超時機制,如果參與者超時未收到doCommit命令的話,將會默認去提交事務。

DoCommit

DoCommit階段對應到2PC的執行階段,如果上一個階段都是收到YES的話,那么就發送doCommit命令去提交事務,反之則會發送abort命令去中斷事務的執行。

如何理解分布式事務

相比2PC的改進

對于2PC的同步阻塞的問題,我們可以看到因為3PC加入了參與者的超時機制,所以原來2PC的如果某個參與者故障導致的同步阻塞的問題時間縮短了,這是一個優化,但是并沒有完全避免。

第二個單點故障的問題,同樣因為超時機制的引入,一定程度上也算是優化了。

但是數據不一致的問題,這個始終沒有得到解決。

舉個栗子:

在PreCommit階段,某個參與者發生腦裂,無法收到TM的請求,這時候其他參與者執行abort事務回滾,而腦裂的參與者超時之后繼續提交事務,還是有可能發生數據不一致的問題。

那么,為什么要加入DoCommit這個階段呢?就是為了引入超時機制,事先我們先確認數據庫是否都可以執行事務,如果都OK,那么才會進入后面的步驟,所以既然都可以執行,那么超時之后說明發生了問題,就自動提交事務。

TCC

TCC的模式叫做Try、Confirm、Cancel,實際上也就是2PC的一個變種而已。

實現這個模式,一個事務的接口需要拆分成3個,也就是Try預占、Confirm確認提交、最后Cancel回滾。

對于TCC來說,實際生產我基本上就沒看見過有人用,考慮到原因,首先是程序員的本身素質參差不齊,多個團隊協作你很難去約束別人按照你的規則來實現,另外一點就是太過于復雜。

如果說有簡單的應用的話,庫存的應用或許可以算做是一個。

一般庫存的操作,很多實現方案里面都會會在下單的時候先預占庫存,下單成功之后再實際去扣減庫存,最終如果發生了異常再回退。

如何理解分布式事務

凍結、預占庫存就是2PC的準備階段,真正下單成功去扣減庫存就是2PC的提交階段,回滾就是某個發生異常的回滾操作,只不過在應用層面來實現了2PC的機制而已。

SAGA

Saga源于1987 年普林斯頓大學的 Hecto 和 Kenneth 發表的如何處理 long lived  transaction(長活事務)論文。

主要思想就是將長事務拆分成多個本地短事務。

如果全部執行成功,就正常完成了,反之,則會按照相反的順序依次調用補償。

SAGA模式有兩種恢復策略:

  1. 向前恢復,這個模式偏向于一定要成功的場景,失敗則會進行重試

  2. 向后恢復,也就是發生異常的子事務依次回滾補償

由于這個模式在國內基本沒看見有誰用的,不在贅述。

消息隊列

基于消息隊列來實現最終一致性的方案,這個相比前面的我個人認為還稍微靠譜一點,那些都是理論啊,正常生產的實現很少看見應用。

基于消息隊列的可能真正在應用的還稍微多一點。

一般來說有兩種方式,基于本地消息表和依賴MQ本身的事務消息。

本地消息表的這個方案其實更復雜,實際上我也沒看到過真正誰來用。這里我以RocketMQ的事務消息來舉例,這個方式相比本地消息表則更完全依賴MQ本身的特性做了解耦,釋放了業務開發的復雜工作量。

如何理解分布式事務

  1. 業務發起方,調用遠程接口,向MQ發送一條半事務消息,MQ收到消息之后會返回給生產者一個ACK

  2. 生產者收到ACK之后,去執行事務,但是事務還沒有提交。

  3. 生產者會根據事務的執行結果來決定發送commit提交或者rollback回滾到MQ

  4. 這一點是發生異常的情況,比如生產者宕機或者其他異常導致MQ長時間沒有收到commit或者rollback的消息,這時候MQ會發起狀態回查。

  5. MQ如果收到的是commit的話就會去投遞消息,消費者正常消費消息即可。如果是rollback的話,則會在設置的固定時間期限內去刪除消息。

這個方案基于MQ來保證消息事務的最終一致性,還算是一個比較合理的解決方案,只要保證MQ的可靠性就可以正常實施應用,業務消費方根據本身的消息重試達到最終一致性。

框架

以上說的都是理論和自己實現的方式,那么分布式事務就沒有框架來解決我們的問題嗎?

有,其實還不少,但是沒有能扛旗者出現,要說有,阿里的開源框架Seata還有阿里云的GTS。

GTS(Global Transaction Service 全局事務服務)是阿里云的中間件產品,只要你用阿里云,付錢就可以用GTS。

Seata(Simple Extensible Autonomous Transaction  Architecture)則是開源的分布式事務框架,提供了對TCC、XA、Saga以及AT模式的支持。

那么,GTS和Seata有什么關系呢?

實際上最開始的時候他們都是基于阿里內部的TXC(Taobao Transaction  Constructor)分布式中間件產品,然后TXC經過改造上了阿里云就叫做GTS。

之后阿里的中間件團隊基于TXC和GTS做出了開源的Seata,其中AT(Automatic Transaction)模式就是GTS原創的方案。

至于現在的版本,可以大致認為他們就是一樣的就行了,到2020年,GTS已經全面兼容了Seata的 GA 版本。

如何理解分布式事務

整個GTS或者Seata包含以下幾個核心組件:

  • Transaction Coordinator(TC):事務協調器,維護全局事務的運行狀態,負責協調并驅動全局事務的提交或回滾。

  • Transaction Manager(TM):控制全局事務的邊界,負責開啟一個全局事務,并最終發起全局提交或全局回滾的決議。

  • Resource Manager(RM):控制分支事務,負責分支注冊、狀態匯報,并接收事務協調器的指令,驅動分支(本地)事務的提交和回滾。

無論對于TCC還是原創的AT模式的支持,整個分布式事務的原理其實相對來說還是比較容易理解。

  1. 事務開啟時,TM向TC注冊全局事務,并且獲得全局事務XID

  2. 這時候多個微服務的接口發生調用,XID就會傳播到各個微服務中,每個微服務執行事務也會向TC注冊分支事務。

  3. 之后TM就可以管理針對每個XID的事務全局提交和回滾,RM完成分支的提交或者回滾。

如何理解分布式事務

AT模式

原創的AT模式相比起TCC的方案來說,無需自己實現多個接口,通過代理數據源的形式生成更新前后的UNDO_LOG,依靠UNDO_LOG來實現回滾的操作。

執行的流程如下:

  1. TM向TC注冊全局事務,獲得XID

  2. RM則會去代理JDBC數據源,生成鏡像的SQL,形成UNDO_LOG,然后向TC注冊分支事務,把數據更新和UNDO_LOG在本地事務中一起提交

  3. TC如果收到commit請求,則會異步去刪除對應分支的UNDO_LOG,如果是rollback,就去查詢對應分支的UNDO_LOG,通過UNDO_LOG來執行回滾

如何理解分布式事務

TCC模式

相比AT模式代理JDBC數據源生成UNDO_LOG來生成逆向SQL回滾的方式,TCC就更簡單一點了。

  1. TM向TC注冊全局事務,獲得XID

  2. RM向TC注冊分支事務,然后執行Try方法,同時上報Try方法執行情況

  3. 然后如果收到TC的commit請求就執行Confirm方法,收到rollback則執行Cancel

如何理解分布式事務

XA模式

  1. TM向TC注冊全局事務,獲得XID

  2. RM向TC注冊分支事務,XA Start,執行SQL,XA END,XA Prepare,然后上報分支執行情況

  3. 然后如果收到TC的commit請求就執行Confirm方法,收到rollback則執行Cancel

如何理解分布式事務

SAGA模式

  • TM向TC注冊全局事務,獲得XID

  • RM向TC注冊分支事務,然后執行業務方法,并且上報分支執行情況

  • RM收到分支回滾,執行對應的業務回滾方法

如何理解分布式事務

到此,相信大家對“如何理解分布式事務”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

达孜县| 孟津县| 锦州市| 榆社县| 赣州市| 通化县| 囊谦县| 北碚区| 德兴市| 鄂温| 博罗县| 德化县| 耿马| 仁化县| 西贡区| 沅陵县| 巴中市| 克拉玛依市| 大兴区| 义马市| 潮州市| 永德县| 阿坝| 夏河县| 沙河市| 原平市| 三门县| 青浦区| 闻喜县| 教育| 巴青县| 长沙县| 如皋市| 乐都县| 咸丰县| 满洲里市| 莒南县| 梅河口市| 深水埗区| 分宜县| 湄潭县|