初識(shí)Open/X XA

初識(shí)Open/X XA

XA是DTP的一部分接口規(guī)范司顿。

Distributed Transaction Processing(DTP)

DTP是一種實(shí)現(xiàn)分布式事務(wù)處理系統(tǒng)的概念模型,OSI和Open/X都有正式文檔來定義它:

  • X/Open Guide, Distributed Transaction Processing Reference Model, X/Open Company Ltd., October 1991.
  • The ISO/IEC Open Systems Interconnection (OSI) Distributed Transaction Processing (DTP) standard.
  • ISO/IEC DIS 10026-1 (1991) (model)
  • ISO/IEC DIS 10026-2 (1991) (service)
  • ISO/IEC DIS 10026-3 (1991) (protocol)

為了簡(jiǎn)化理解蚓让,我們只考慮它的靜態(tài)結(jié)構(gòu)。在DTP的經(jīng)典結(jié)構(gòu)圖(下圖)中,整套系統(tǒng)由三種角色構(gòu)成。

DTP diagram
  • 應(yīng)用程序(Application Program鉴嗤,AP)

    這個(gè)角色要做兩件事情,一方面是定義構(gòu)成整個(gè)事務(wù)所需要的所有操作序调,另一方面是親自訪問資源節(jié)點(diǎn)來執(zhí)行操作醉锅。

The AP defines ** transactions ** and accesses ** resources **
within transaction boundaries.

  • 資源管理器(Resource Managers,RM)

    這個(gè)角色是管理著某些共享資源的自治域发绢,比如說一個(gè)MySQL數(shù)據(jù)庫實(shí)例硬耍。在DTP里面,還有兩個(gè)要求边酒,一是RM自身必須是支持事務(wù)的经柴,二是RM能夠根據(jù)
    將全局(分布式)事務(wù)標(biāo)識(shí)定位到自己內(nèi)部的對(duì)應(yīng)事務(wù)。

Every RM in the DTP environment must support transactions as
described in Section 2.2.1 on page 4
An RM is responsible for mapping its recoverable units of work to
the global transaction

  • 事務(wù)管理器(Transaction Manager墩朦,TM)

    這個(gè)角色能與AP和RM直接通信坯认,協(xié)調(diào)AP和RM來實(shí)現(xiàn)分布式事務(wù)的完整性。主要的工作是提供AP注冊(cè)全局事務(wù)的接口氓涣,頒發(fā)全局事務(wù)標(biāo)識(shí)(GTID之類 的)牛哺,存儲(chǔ)/管理全局事務(wù)的內(nèi)容和決策并指揮RM做commit/rollback。

XA在哪里劳吠?XA是RM和TM的交互規(guī)范和接口定義

eXtended Architecture(XA)

TM和RM們之間使用的是上文提到的《ISO/TEC DIS 10026-1 (1991) (model)》所定義的二階段提交引润。在XA規(guī)范的描述中,兩階段提交TM協(xié)調(diào)RM們完成已定義的全局事務(wù)的方法痒玩,AP找TM申請(qǐng)/注冊(cè)全局事務(wù)的動(dòng)作并不是二階段提交的保障內(nèi)容淳附。

二階段提交(two-phase commit)

對(duì)于單個(gè)全局(分布式)事務(wù),在DTP環(huán)境中蠢古,二階段提交流程大致如下:

  1. 第一階段(Phase 1)

TM請(qǐng)求所有RM進(jìn)行準(zhǔn)備(prepare commit, or prepare)燃观,并告知它們各自需要做的局部事務(wù)(transaction branche)。RM收到請(qǐng)求后便瑟,如果判斷可以完成自己的局部事務(wù),那就持久化局部事務(wù)的工作內(nèi)容番川,再給TM肯定答復(fù)到涂;要是發(fā)生了其他情況脊框,那給TM的都是否定答復(fù)。在發(fā)送了否定答復(fù)并回滾了局部事務(wù)之后践啄,RM才能丟棄持久化了的局部事務(wù)信息浇雹。

  1. 第二階段(Phase 2)

TM根據(jù)情況(比如說所有RM都prepare成功,或者屿讽,AP通知它要rollback等)昭灵,先持久化它對(duì)這個(gè)全局事務(wù)的處理決定和所涉及的RM清單,然后通知所有涉及的RM去提交(commit)或者回滾(rollback)它們的局部事務(wù)伐谈。RM們處理完自己的局部事務(wù)后烂完,將返回值告訴TM之后,TM才可以清除掉包括剛才持久化的處理決定和RM清單在內(nèi)的這個(gè)全局事務(wù)的信息诵棵。

兩階段提交的協(xié)議層面優(yōu)化

  • 只讀斷言

    在Phase 1中抠蚣,RM可以斷言“我這邊不涉及數(shù)據(jù)增刪改”來答復(fù)TM的prepare請(qǐng)求,從而讓這個(gè)RM脫離當(dāng)前的全局事務(wù)履澳,從而免去了Phase 2嘶窄。

    這種優(yōu)化發(fā)生在其他RM都完成prepare之前的話,使用了只讀斷言的RM早于AP其他動(dòng)作(比如說這個(gè)RM返回那些只讀數(shù)據(jù)給AP)前距贷,就釋放了相關(guān)數(shù)據(jù)的上下文(比如讀鎖之類的)柄冲,這時(shí)候其他全局事務(wù)或者本地事務(wù)就有機(jī)會(huì)去改變這些數(shù)據(jù),結(jié)果就是無法保障整個(gè)系統(tǒng)的可序列化特性——通俗點(diǎn)說那就會(huì)有臟讀的風(fēng)險(xiǎn)忠蝗。

  • 一階段提交(one-phase commit)

    如果需要增刪改的數(shù)據(jù)都在同一個(gè)RM上现横,TM可以使用一階段提交——跳過兩階段提交中的Phase 1,直接執(zhí)行Phase 2什湘。

    但這種優(yōu)化的本質(zhì)是跳過Phase 1长赞,這種情況下,RM自行決定了整個(gè)局部事務(wù)的結(jié)果闽撤,并且在答復(fù)TM前就清除掉局部事務(wù)(因?yàn)镻hase 2中RM應(yīng)答完請(qǐng)求后得哆,TM就沒有必要去聯(lián)系它了),這樣TM就沒有必要去持久化使用了這種優(yōu)化的全局事務(wù)哟旗,也導(dǎo)致在某些系統(tǒng)故障(比如說由于網(wǎng)絡(luò)通信抖動(dòng)贩据,TM沒收到RM的回復(fù))時(shí),TM可能會(huì)完全不知道這類事務(wù)的執(zhí)行結(jié)果闸餐。

使用X/Open XA接口描述的二階段提交

X/Open的XA接口分為兩類:

  • 一類是ax_開頭的饱亮,只有ax_reg()和ax_unreg()兩個(gè),由TM提供給RM調(diào)用舍沙,從而支撐起RM加入/退出集群時(shí)的動(dòng)態(tài)注冊(cè)機(jī)制

  • 另一類是xa_開頭的近上,由RM提供給TM調(diào)用,用于實(shí)現(xiàn)二階段提交中的各種事務(wù)提交拂铡、恢復(fù)功能

    下面是使用這些接口來描述的二階段提交的一個(gè)流程示意圖:

Descript 2PC with XA interface
  1. 在開始一個(gè)全局事務(wù)之前壹无,涉及的RM必須通過ax_regr()葱绒,向TM注冊(cè)以加入集群;對(duì)應(yīng)的斗锭,在沒有事務(wù)需要處理的時(shí)候地淀,RM可以通過ax_unreg()向TM要求注銷,離開集群岖是。

  2. TM在對(duì)一個(gè)RM執(zhí)行xa_開頭的具體操作前帮毁,必須先通過xa_open()打開這個(gè)RM(本質(zhì)是建立對(duì)話)——這其實(shí)也是分配XID的一個(gè)行為;與之相應(yīng)的豺撑,TM執(zhí)行xa_close()來關(guān)閉RM烈疚。

  3. TM對(duì)RM調(diào)用的xa_start()和xa_stop()這對(duì)組合,一般用于標(biāo)記局部事務(wù)的開頭和結(jié)尾前硫。這里需要注意的有三點(diǎn):

  4. 對(duì)于同一個(gè)RM胞得,根據(jù)全局事務(wù)的要求,可以前后執(zhí)行多對(duì)組合——俾如說屹电,先標(biāo)記一個(gè)流水賬INSERT的局部事務(wù)操作阶剑,然后再標(biāo)記賬戶UPDATE的局部事務(wù)操作。

  5. TM執(zhí)行該組合只是起到標(biāo)記事務(wù)的作用危号,具體的業(yè)務(wù)命令是由AP交給RM的牧愁。

  6. 該組合除了執(zhí)行這些標(biāo)記工作外,其實(shí)還能在RM中實(shí)現(xiàn)多線程的join/suspend/resume管理外莲。

  7. TM調(diào)用RM的xa_prepare()來進(jìn)行第一階段猪半,調(diào)用xa_commit()或xa_rollback()執(zhí)行第二階段。

XA接口清單

規(guī)范中使用ISO C描述了一個(gè)xa.h的頭文件偷线,給出了XA接口的定義磨确。

  • ax_XXX接口

  • ax_reg
    向一個(gè)TM注冊(cè)一個(gè)RM

  • ax_unreg
    向一個(gè)TM注銷一個(gè)RM

  • xa_XXX接口

  • xa_close
    停止當(dāng)前AP對(duì)某個(gè)RM的使用

  • xa_commit
    通知RM去提交局部事務(wù)(第二階段)

  • xa_complete
    詢問指定的異步xa_操作是否完成

  • xa_end
    解除線程與局部事務(wù)的關(guān)聯(lián)

  • xa_forget
    RM存在一種優(yōu)化方式,就是在第一階段進(jìn)行先行完成(heuristiccally complete)局部事務(wù)声邦,從而盡早釋放資源(如釋放鎖等)乏奥,但保留局部事務(wù)回滾能力與全局事務(wù)的對(duì)應(yīng)關(guān)系等事務(wù)元數(shù)據(jù);如果全局事務(wù)成功的話亥曹,TM通過這個(gè)接口許可RM廢棄這個(gè)事務(wù)的事務(wù)元數(shù)據(jù)

  • xa_open
    初始化某個(gè)RM給當(dāng)前AP使用

  • xa_prepare
    通知目標(biāo)RM進(jìn)行第一階段工作

  • xa_recover
    獲取指定RM上已完成了第一階段或者先行完成的XID清單

  • xa_rollback
    通知指定RM回滾指定的局部事務(wù)

  • xa_start
    啟動(dòng)或恢復(fù)RM上的局部事務(wù)邓了,換句話說,TM告訴這個(gè)RM媳瞪,它后面的工作都與它現(xiàn)在給的XID相關(guān)骗炉。

參考

Distributed Transaction Processing: The XA Specification

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蛇受,隨后出現(xiàn)的幾起案子句葵,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笼呆,死亡現(xiàn)場(chǎng)離奇詭異熊响,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)诗赌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秸弛,“玉大人铭若,你說我怎么就攤上這事〉堇溃” “怎么了叼屠?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)绞铃。 經(jīng)常有香客問我镜雨,道長(zhǎng),這世上最難降的妖魔是什么儿捧? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任荚坞,我火速辦了婚禮,結(jié)果婚禮上菲盾,老公的妹妹穿的比我還像新娘颓影。我一直安慰自己,他們只是感情好懒鉴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布诡挂。 她就那樣靜靜地躺著,像睡著了一般临谱。 火紅的嫁衣襯著肌膚如雪璃俗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天悉默,我揣著相機(jī)與錄音城豁,去河邊找鬼。 笑死麦牺,一個(gè)胖子當(dāng)著我的面吹牛钮蛛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剖膳,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼魏颓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了吱晒?” 一聲冷哼從身側(cè)響起甸饱,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后叹话,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偷遗,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年驼壶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氏豌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡热凹,死狀恐怖泵喘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情般妙,我是刑警寧澤纪铺,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站碟渺,受9級(jí)特大地震影響鲜锚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苫拍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一芜繁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怯疤,春花似錦浆洗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至塔淤,卻和暖如春摘昌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背高蜂。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工聪黎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人备恤。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓稿饰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親露泊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喉镰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容