xa是x/open dtp定義的交易中間件與數(shù)據(jù)庫之間的接口規(guī)范(即接口函數(shù)),交易中間件用它來通知數(shù)據(jù)庫事務(wù)的開始、結(jié)束以及提交、回滾等。xa接口函數(shù)則由數(shù)據(jù)庫廠商提供。

  在談到xa規(guī)范之前,必須首先了解分布式事務(wù)處理(distributed transaction processing)的概念。transaction,即事務(wù),指一個程序或程序段,在一個或多個資源如數(shù)據(jù)庫或文件上為完成某些功能的執(zhí)行過程的集合。

分布式事務(wù)處理是指一個事務(wù)可能涉及多個數(shù)據(jù)庫操作,分布式事務(wù)處理的關(guān)鍵是必須有一種方法可以管理事務(wù)在任何地方所做的所有動作,提交或回滾事務(wù)的決定必須產(chǎn)生統(tǒng)一的結(jié)果(全部提交或全部回滾)。

x/open組織(即現(xiàn)在的open group)定義了分布式事務(wù)處理模型。x/open dtp模型(1994)包括應(yīng)用程序(ap)、事務(wù)管理器(tm)、資源管理器(rm)、通信資源管理器(crm)四部分。一般,常見的事務(wù)管理器(tm)是交易中間件,常見的資源管理器(rm)是數(shù)據(jù)庫,常見的通信資源管理器(crm)是消息中間件。為表述方便起見,在本文中直接以其常見表現(xiàn)形式進行描述。

通常把一個數(shù)據(jù)庫內(nèi)部的事務(wù)處理,如對多個表的操作,作為本地事務(wù)看待。數(shù)據(jù)庫的事務(wù)處理對象是本地事務(wù),而分布式事務(wù)處理的對象是全局事務(wù)。

所謂全局事務(wù),是指分布式事務(wù)處理環(huán)境中,多個數(shù)據(jù)庫可能需要共同完成一個工作,這個工作即是一個全局事務(wù),例如,一個事務(wù)中可能更新幾個不同的數(shù)據(jù)庫。對數(shù)據(jù)庫的操作發(fā)生在系統(tǒng)的各處但必須全部被提交或回滾。此時一個數(shù)據(jù)庫對自己內(nèi)部所做操作的提交不僅依賴本身操作是否成功,還要依賴與全局事務(wù)相關(guān)的其它數(shù)據(jù)庫的操作是否成功,如果任一數(shù)據(jù)庫的任一操作失敗,則參與此事務(wù)的所有數(shù)據(jù)庫所做的所有操作都必須回滾。

一般情況下,某一數(shù)據(jù)庫無法知道其它數(shù)據(jù)庫在做什么,因此,在一個dtp環(huán)境中,交易中間件是必需的,由它通知和協(xié)調(diào)相關(guān)數(shù)據(jù)庫的提交或回滾。而一個數(shù)據(jù)庫只將其自己所做的操作(可恢復(fù))影射到全局事務(wù)中。


xa規(guī)范的基礎(chǔ)是兩階段提交協(xié)議。

在第一階段,交易中間件請求所有相關(guān)數(shù)據(jù)庫準備提交(預(yù)提交)各自的事務(wù)分支,以確認是否所有相關(guān)數(shù)據(jù)庫都可以提交各自的事務(wù)分支。當(dāng)某一數(shù)據(jù)庫收到預(yù)提交后,如果可以提交屬于自己的事務(wù)分支,則將自己在該事務(wù)分支中所做的操作固定記錄下來,并給交易中間件一個同意提交的應(yīng)答,此時數(shù)據(jù)庫將不能再在該事務(wù)分支中加入任何操作,但此時數(shù)據(jù)庫并沒有真正提交該事務(wù),數(shù)據(jù)庫對共享資源的操作還未釋放(處于上鎖狀態(tài))。如果由于某種原因數(shù)據(jù)庫無法提交屬于自己的事務(wù)分支,它將回滾自己的所有操作,釋放對共享資源上的鎖,并返回給交易中間件失敗應(yīng)答。

在第二階段,交易中間件審查所有數(shù)據(jù)庫返回的預(yù)提交結(jié)果,如所有數(shù)據(jù)庫都可以提交,交易中間件將要求所有數(shù)據(jù)庫做正式提交,這樣該全局事務(wù)被提交。而如果有任一數(shù)據(jù)庫預(yù)提交返回失敗,交易中間件將要求所有其它數(shù)據(jù)庫回滾其操作,這樣該全局事務(wù)被回滾。

以一個全局事務(wù)為例,ap首先通知交易中間件開始一個全局事務(wù),交易中間件通過xa接口函數(shù)通知數(shù)據(jù)庫開始事務(wù),然后ap可以對數(shù)據(jù)庫管理的資源進行操作,數(shù)據(jù)庫系統(tǒng)記錄事務(wù)對本地資源的所有操作。操作完成后交易中間件通過xa接口函數(shù)通知數(shù)據(jù)庫操作完成。交易中間件負責(zé)記錄ap操作過哪些數(shù)據(jù)庫(事務(wù)分支)。ap根據(jù)情況通知交易中間件提交該全局事務(wù),交易中間件會通過xa接口函數(shù)要求各個數(shù)據(jù)庫做預(yù)提交,所有數(shù)據(jù)庫返回成功后要求各個數(shù)據(jù)庫做正式提交,此時一筆全局事務(wù)結(jié)束。

xa規(guī)范對應(yīng)用來說,最大好處在于事務(wù)的完整性由交易中間件和數(shù)據(jù)庫通過xa接口控制,ap只需要關(guān)注與數(shù)據(jù)庫的應(yīng)用邏輯的處理,而無需過多關(guān)心事務(wù)的完整性,應(yīng)用設(shè)計開發(fā)會簡化很多。

具體來說,如果沒有交易中間件,應(yīng)用系統(tǒng)需要在程序內(nèi)部直接通知數(shù)據(jù)庫開始、結(jié)束和提交事務(wù),當(dāng)出現(xiàn)異常情況時必須由專門的程序?qū)?shù)據(jù)庫進行反向操作才能完成回滾。如果是有很多事務(wù)分支的全局事務(wù),回滾時情況將變得異常復(fù)雜。而使用xa接口,則全局事務(wù)的提交是由交易中間件控制,應(yīng)用程序只需通知交易中間件提交或回滾事務(wù),就可以控制整個事務(wù)(可能涉及多個異地的數(shù)據(jù)庫)的全部提交或回滾,應(yīng)用程序完全不用考慮沖正邏輯。

http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0505weber/index.html
這篇文章里面有非常詳細的代碼描繪,值得參考。

http://www.cnblogs.com/sunwei2012/archive/2010/01/08/1642295.html
這也是一篇不錯的文章。