初識(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)成。
-
應(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)境中蠢古,二階段提交流程大致如下:
- 第一階段(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ù)信息浇雹。
- 第二階段(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è)流程示意圖:
在開始一個(gè)全局事務(wù)之前壹无,涉及的RM必須通過ax_regr()葱绒,向TM注冊(cè)以加入集群;對(duì)應(yīng)的斗锭,在沒有事務(wù)需要處理的時(shí)候地淀,RM可以通過ax_unreg()向TM要求注銷,離開集群岖是。
TM在對(duì)一個(gè)RM執(zhí)行xa_開頭的具體操作前帮毁,必須先通過xa_open()打開這個(gè)RM(本質(zhì)是建立對(duì)話)——這其實(shí)也是分配XID的一個(gè)行為;與之相應(yīng)的豺撑,TM執(zhí)行xa_close()來關(guān)閉RM烈疚。
TM對(duì)RM調(diào)用的xa_start()和xa_stop()這對(duì)組合,一般用于標(biāo)記局部事務(wù)的開頭和結(jié)尾前硫。這里需要注意的有三點(diǎn):
對(duì)于同一個(gè)RM胞得,根據(jù)全局事務(wù)的要求,可以前后執(zhí)行多對(duì)組合——俾如說屹电,先標(biāo)記一個(gè)流水賬INSERT的局部事務(wù)操作阶剑,然后再標(biāo)記賬戶UPDATE的局部事務(wù)操作。
TM執(zhí)行該組合只是起到標(biāo)記事務(wù)的作用危号,具體的業(yè)務(wù)命令是由AP交給RM的牧愁。
該組合除了執(zhí)行這些標(biāo)記工作外,其實(shí)還能在RM中實(shí)現(xiàn)多線程的join/suspend/resume管理外莲。
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è)RMax_unreg
向一個(gè)TM注銷一個(gè)RMxa_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)骗炉。