分布式事務(wù)之兩階段提交(2PC)

兩階段提交(2PC) 是 Oracle Tuxedo 系統(tǒng)提出的 XA 分布式事務(wù)協(xié)議的其中一種實(shí)現(xiàn)方式六孵。

一、關(guān)于 XA 分布式事務(wù)協(xié)議

XA 分布式協(xié)議主要有兩個(gè)角色:

  • 事務(wù)管理器(協(xié)調(diào)者)
    事務(wù)管理器作為全局事務(wù)的協(xié)調(diào)管理者太援,與每個(gè)資源管理器通信闽晦,完成分布式事務(wù)的管理。
  • 資源管理器 (參與者)
    資源管理器管理每個(gè)參與者的事務(wù)資源粉寞,其應(yīng)該具有提交和回滾的能力尼荆,如數(shù)據(jù)庫。

XA 分布式協(xié)議制定的分段提交過程:

  • 第一階段( prepare )
    第一階段每個(gè)參與者準(zhǔn)備執(zhí)行事務(wù)并對(duì)需要的資源加鎖唧垦,進(jìn)入 ready 狀態(tài),并通知協(xié)調(diào)者已經(jīng)準(zhǔn)備就緒液样。
  • 第二階段( commit )
    第二階段當(dāng)協(xié)調(diào)者確認(rèn)每個(gè)參與者都 ready 后振亮,通知參與者進(jìn)行 commit 操作;如果有參與者 fail 鞭莽,則發(fā)送 rollback 命令坊秸,各參與者做回滾。

二澎怒、兩階段提交( 2PC )

基于 XA 協(xié)議褒搔,有了兩階段提交的實(shí)現(xiàn),在 JAVA 中可以使用基于兩階段提交的 atomikos 來進(jìn)行分布式事務(wù)管理喷面。

理解起來其實(shí)很簡單星瘾,下面就從 2PC 的不同階段和不同的狀態(tài)來分析它的執(zhí)行過程:

第一階段

  • 各參與者都成功的情況


    1. 首先事務(wù)協(xié)調(diào)者向所有參與者發(fā)送 prepare 請求。
    2. 參與者開始執(zhí)行各自的數(shù)據(jù)更新惧辈,寫入各自的 Undo Log 和 Redo Log琳状。
    3. 參與者執(zhí)行成功后,暫時(shí)不提交事務(wù)盒齿,向協(xié)調(diào)者發(fā)送 Done 消息念逞。
    4. 進(jìn)入第二階段困食。
  • 有參與者失敗的情況


    在第一階段,如果參與者在本地事務(wù)中執(zhí)行失敗翎承,會(huì)向協(xié)調(diào)者發(fā)送 Fail 消息硕盹,協(xié)調(diào)者產(chǎn)生事務(wù)中斷。

  • 事務(wù)中斷

任何一個(gè)參與者向協(xié)調(diào)者反饋了 Fail 消息叨咖,或者在等待超時(shí)之后莱睁,協(xié)調(diào)者不能接收到參與者的反饋響應(yīng),就會(huì)中斷事務(wù)芒澜。

步驟如下:

  1. 協(xié)調(diào)者向所有參與者發(fā)出 Rollback 請求仰剿。
  2. 參與者收到 Rollback 請求之后,會(huì)利用其在階段一種記錄的 Undo 信息來執(zhí)行事務(wù)回滾操作痴晦,并在完成回滾之后釋放在整個(gè)事物執(zhí)行期間占用的資源南吮。
  3. 參與者在完成事物回滾之后,向協(xié)調(diào)者發(fā)送 Ack 消息誊酌。
  4. 中斷事務(wù)

第二階段

第二階段中部凑,如果所有參與者的都執(zhí)行成功,則協(xié)調(diào)者下發(fā) Commit 消息涂邀,參與者提交本地事務(wù),釋放鎖住的資源箱锐,并向協(xié)調(diào)者發(fā)送 Ack 確認(rèn)。

當(dāng)協(xié)調(diào)者受到所有的參與者確認(rèn)消息后驹止,整個(gè)分布式事務(wù)結(jié)束浩聋。

三臊恋、總結(jié)

基于以上,可以很容易理解 2PC 的執(zhí)行過程抖仅,同時(shí)我們也注意到它存在的缺點(diǎn):

  1. 對(duì)高并發(fā)不友好坊夫。
    在分布式事務(wù)的執(zhí)行過程中撤卢,存在多次通信,占用時(shí)間長凸丸,并且在這個(gè)過程中所有節(jié)點(diǎn)處于阻塞狀態(tài),每個(gè)參與者持有的資源始終要加鎖屎慢。
  2. 單點(diǎn)故障瞭稼。由上面可知協(xié)調(diào)者扮演著非常重要的角色,一旦協(xié)調(diào)者發(fā)生故障环肘,參與者就會(huì)一直阻塞下去欲虚。尤其在第二階段悔雹,協(xié)調(diào)者發(fā)生故障复哆,那么所有的參與者還都處于鎖定事務(wù)資源的狀態(tài)中,而無法繼續(xù)完成事務(wù)操作腌零。
  3. 數(shù)據(jù)不一致梯找。在第二階段中,當(dāng)協(xié)調(diào)者向參與者發(fā)送 commit 請求之后益涧,發(fā)生了局部網(wǎng)絡(luò)異承獯福或者在發(fā)送 commit 請求過程中協(xié)調(diào)者發(fā)生了故障,就會(huì)導(dǎo)致只有一部分參與者接受到了commit 請求闲询。而在這部分參與者接到 commit 請求之后就會(huì)執(zhí)行 commit 操作久免,但是其他未接到 commit 請求的機(jī)器則無法執(zhí)行事務(wù)提交,就導(dǎo)致了數(shù)據(jù)的不一致扭弧。

歡迎訪問個(gè)人博客 獲取更多知識(shí)分享阎姥。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸽捻,隨后出現(xiàn)的幾起案子呼巴,更是在濱河造成了極大的恐慌,老刑警劉巖泊愧,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伊磺,死亡現(xiàn)場離奇詭異,居然都是意外死亡删咱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門豪筝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痰滋,“玉大人,你說我怎么就攤上這事续崖∏媒郑” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵严望,是天一觀的道長多艇。 經(jīng)常有香客問我,道長像吻,這世上最難降的妖魔是什么复隆? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮姆涩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骨饿。我一直安慰自己耕渴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般期升。 火紅的嫁衣襯著肌膚如雪取逾。 梳的紋絲不亂的頭發(fā)上箕母,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音嘶是,去河邊找鬼钙勃。 笑死聂喇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的希太。 我是一名探鬼主播克饶,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼矾湃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了堕澄?” 一聲冷哼從身側(cè)響起邀跃,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤拍屑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后僵驰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡星爪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年矮男,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毡鉴。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖憎瘸,靈堂內(nèi)的尸體忽然破棺而出陈瘦,到底是詐尸還是另有隱情,我是刑警寧澤痊项,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站皱埠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏边器。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一忘巧、第九天 我趴在偏房一處隱蔽的房頂上張望睦刃。 院中可真熱鬧,春花似錦涩拙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春好唯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骑篙。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谎势,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓脏榆,卻偏偏與公主長得像台谍,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趁蕊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349