4.1 XA 規(guī)范
X/Open的組織定義了分布式事務(wù)的模型唆阿,這里面有幾個角色暖夭,AP(Application,應(yīng)用程序)两芳,TM(Transaction Manager摔寨,事務(wù)管理器),RM(Resource Manager怖辆,資源管理器)是复,CRM(Communication Resource Manager,通信資源管理器)疗隶。
全局事務(wù):X/Open組織定義了一套分布式事務(wù)的模型和規(guī)范佑笋。一個橫跨多個數(shù)據(jù)庫的事務(wù)。就是一個事務(wù)里斑鼻,涉及了多個數(shù)據(jù)庫的操作蒋纬,然后要保證多個數(shù)據(jù)庫中,任何一個操作失敗了坚弱,其他所有庫的操作全部回滾蜀备,這就是所謂的分布式事務(wù)。
DTP(Distributed Transaction Processing Reference Model):分布式事務(wù)處理模型荒叶。TM碾阁、RM、AP等角色的分布式事務(wù)的模型些楣。
JTA事務(wù):Java Transaction API脂凶,分布式事務(wù)的編程API泊脐,它是按照XA喉钢、DTP那套模型和規(guī)范來搞的,在J2EE中笆环,單庫的事務(wù)是通過JDBC事務(wù)來支持的鹅很,如果是跨多個庫的事務(wù)嘶居,是通過JTA API來支持的,通過JTA API可以協(xié)調(diào)和管理橫跨多個數(shù)據(jù)庫的分布式事務(wù)促煮,一般來說會結(jié)合JNDI邮屁。
4.2 2PC協(xié)議
2PC整袁,Two-Phase Commit,即二階段提交佑吝,二階段提交協(xié)議是將事務(wù)的提交過程分成了兩個階段來進(jìn)行處理坐昙。
MySQL支持的是2PC協(xié)議。
2PC協(xié)議的缺陷:
1芋忿、同步阻塞:在階段一里執(zhí)行prepare操作會占用資源民珍,一直到整個分布式事務(wù)完成,才會釋放資源盗飒,這個過程中嚷量,如果有其他人要訪問這個資源,就會被阻塞住逆趣。
2蝶溶、單點(diǎn)故障:TM是個單點(diǎn)。
3宣渗、事務(wù)狀態(tài)丟失:即使把TM做成一個雙機(jī)熱備的抖所,一個TM掛了自動選舉其他的TM出來,但是如果TM掛掉的同時(shí)痕囱,接收到commit消息的某個庫也掛了田轧,此時(shí)即使重新選舉了其他的TM,根本不知道這個分布式事務(wù)當(dāng)前的狀態(tài)鞍恢,因?yàn)椴恢滥膫€庫接收過commit消息傻粘,哪個接收過commit消息的庫也掛了。
4帮掉、腦裂問題:在階段二中弦悉,如果發(fā)生了腦裂問題,那么就會導(dǎo)致某些數(shù)據(jù)庫沒有接收到commit消息蟆炊,有些庫收到了commit消息稽莉。
4.3 3PC協(xié)議
3PC,Three-Phase Commit涩搓,即三階段提交污秆,是2PC的改進(jìn)版,其將二階段提交協(xié)議的"提交事務(wù)請求"過程一分為二昧甘,形成了CanCommit良拼、PreCommit和do Commit三個階段組成的事務(wù)處理協(xié)議。
3PC協(xié)議的缺陷:
如果TM在DoCommit階段發(fā)送了abort消息給各個庫疾层,結(jié)果因?yàn)槟X裂問題将饺,某個庫沒接收到abort消息贡避,自己還去進(jìn)行commit操作痛黎,導(dǎo)致數(shù)據(jù)出錯予弧。
4.4 JTA + Atomikos
XA分布式事務(wù):管理橫跨多個數(shù)據(jù)庫的分布式事務(wù)。一般用于單系統(tǒng)多庫的場景湖饱,要是多系統(tǒng)多庫掖蛤,比較麻煩。
JTA負(fù)責(zé)Atomikos框架的一個指揮和調(diào)度井厌,讓它按照事務(wù)的基本步驟來走蚓庭,Atomikos框架相當(dāng)于是DTP模型里的TM,跟各個MySQL(RM)通信仅仆,XA START器赞、XA END、XA COMMIT墓拜、XA ROLLBACK等符合XA規(guī)范的一套接口調(diào)用港柜。
實(shí)現(xiàn)原理:創(chuàng)建分布式事務(wù)的時(shí)候,創(chuàng)建一個代表了分布式事務(wù)的對象咳榜。在各個SQL執(zhí)行的時(shí)候夏醉,必須從 自定義的DataSource里面獲取Connection,對Connection的prepareStatement()方法的調(diào)用涌韩,需要進(jìn)行攔截畔柔,去對各個庫執(zhí)行XA START指令,以及定義好SQL臣樱;在提交事務(wù)的時(shí)候靶擦,需要去對各個庫執(zhí)行XA PREPARE指令,如果都成功雇毫,就執(zhí)行XA COMMIT指令奢啥,如果失敗,就執(zhí)行XA ROLLBACK指令嘴拢。