XA是X/Open組織為DTP(分布式事務處理)制定的标準協定。XA的目的是保證分布式事務的ACID特性,就像本地事務一樣。
XA協定主要定義了三種角色:
ü RM,資料總管,典型的例如Oracle資料庫
ü TM,事務管理器,典型的例如CICS
ü AP,通路RM的應用程式,并通過TX接口通路TM,送出和結束分布式事務。
RM最重要的特定是能夠在故障發生後恢複到故障發生前的一緻狀态,例如關系型資料庫、事務隊列以及支援事務的檔案系統等(NTFS支援事務,FAT32不支援事務),同時它還必須實作了XA協定要求的接口函數。Oracle資料庫就是一種RM。
在分布式事務中RM維護自己的事務分支,在TM的要求下準備送出、送出或者復原事務分支。
TPM是個完整的産品,處理AP發起的事務請求,管理分布式事務中RM的狀态,最重要的是控制事務的結束,也就是要求所有參與到分布式事務的RM都送出或者復原本地事務分支。TM是TPM的一部分,通過兩階段送出方式實作了這個功能。
TM和RM之間的通信接口就是XA協定。RM實作XA協定要求的接口函數,TM調用這些接口函數來管理各個RM中的事務分支,例如要求RM準備送出事務分支等。
TPM和AP之間的接口不在XA協定範圍内,由各個TPM供應商自己提供,通常包括允許AP發起分布式事務、送出分布式事務和復原分布式事務。
AP就是通路RM的應用程式。AP通路RM的接口函數由RM供應商自己提供。當AP需要發起一個包含了多個RM的分布式事務時,它通常需要調用TM提供的API。有些TM支援隐式地發起分布式事務。當AP需要結束事務時,它也要調用TM提供的API。是以AP不能直接在RM上發起或者結束事務,而是通過TM來處理。
XA協定要求RM實作某些函數(xa_*)以及提供資料結構、庫檔案等資訊
函數 作用 備注
xa_open 連接配接到RM 不同的RM廠商要求不同格式的字元串
xa_close 從RM斷開 不同的RM廠商要求不同格式的字元串
xa_start 發起一個分布式事務,給與一個事務ID。或者将某個process關聯到已存在的分布式事務
xa_end 将process從關聯的分布式事務中剝離
xa_prepare 要求參與到分布式事務的RM準備送出事務分支 2PC的第1階段
xa_commit 要求參與到分布式事務的RM送出事務分支 2PC的第2階段
xa_rollback 要求參與到分布式事務的RM復原事務分支 2PC的第2階段
xa_forget 要求參與到分布式事務的RM丢棄事務分支資訊
xa_recover 從RM擷取prepared狀态、已送出或者已復原(但是事務資訊還沒丢棄)的事務清單 TM崩潰?
xa_switch_t結構
struct xa_switch_t {
char name[RMNAMESZ]; /* name of resource manager /
long flags; / options specific to the resource manager /
long version; / must be 0 */
int (*xa_open_entry)(char , int, long); / xa_open function pointer */
int (*xa_close_entry)(char , int, long); / xa_close function pointer */
int (*xa_start_entry)(XID , int, long); / xa_start function pointer */
int (*xa_end_entry)(XID , int, long); / xa_end function pointer */
int (xa_rollback_entry)(XID , int, long); / xa_rollback function pointer/
int (*xa_prepare_entry)(XID , int, long); / xa_prepare function pointer */
int (*xa_commit_entry)(XID , int, long); / xa_commit function pointer */
int (*xa_recover_entry)(XID , long, int, long); / xa_recover function pointer */
int (*xa_forget_entry)(XID , int, long); / xa_forget function pointer */
int (*xa_complete_entry)(int , int , int, long); / xa_complete function pointer/
};
xa資訊 備注
xa_switch_t結構 這個結構中包含了RM提供的xa_*函數的位址以及其他資訊
Oracle靜态注冊使用的外部變量名是xaosw,動态注冊使用xaoswd
xa_switch_t名稱 xa_switch_t結構中的第一個field,用于辨別RM名稱。
Oracle的RM名稱就是Oracle_XA
xa_open字元串 連接配接到RM時提供的資訊,例如使用者名、密碼以及資料庫名等。不同類型的RM有不同的格式要求
xa_close字元串 從RM斷開時提供的資訊。
Oracle不使用xa_close字元串。
xa library Oracle動态注冊的話要rebuild genclntsh庫檔案
Oracle的xa_open字元串有特定格式:ORACLE_XA{+required_fields…} [+optional_fields…]
ORACLE_XA是保留關鍵字
有必須項和可選項,各項之間用+隔離
XAOpen=“Oracle_XA+ACC=P/system/oracle+SqlNet=cloud+SesTm=30+LogDir=/tmp/xa+DbgFl=1+DB=cloud”
必須項 作用
ACC=P/system/oracle 登入資料庫的使用者名和密碼
SesTm=30 事務分支的空閑時間。在規定時間内事務分支沒有新的請求,或者沒有結束,就自動復原。0意味着沒有限制
可選項 作用
SqlNet 登入到目标資料庫的tns名稱。如果要登入多個資料庫,這是必須項。
DB pc程式中通過AT關鍵字來指定執行sql語句的資料庫,不指定的話就是在預設資料庫上執行。如果要登入多個資料庫,隻有1個資料庫不用指定DB,其他資料庫必須指定DB。
LogDir 存放xa trace檔案的目錄。注意目錄權限
DbgFl xa tracefile的詳細程度。0x1記錄TM調用和退出标準xa_*函數,0x2記錄TM調用和退出非标準XA函數,0x4記錄XA庫調用的其他函數,例如OCI等。以上flag可以同時使用。
MaxCur xa_open連接配接到資料庫後配置設定的cursor數量。作用和Proc的maxopencursors參數相同,但是優先級更高。
SesWt 等待其他會話占用事務分支的時間間隔。逾時就傳回XA_RETRY
Threads TM是否采用多線程連接配接到資料庫
通過XA發起的分布式事務不僅在dba_2pc_pendings和dba_2pc_neighbors中有紀錄,在dba_pending_transactions和v
global_transaction中記錄所有active狀态的分布式事務,dba_pending_transaction中記錄所有prepared狀态的分布式事務。xa_open字元串中指定的資料庫使用者必須能夠查詢dba_pending_transaction。
在dba_2pc_*中記錄的通過XA發起的分布式事務和通過dblink發起的分布式事務有不同:
dba_2pc_neighbors的DBID字段總是xa_orcl,DBUSER_OWNER字段總是db_namexa.oracle.com。其中db_name就是xa_open字元串中的DB項。
處理未決事務是TM的責任,僅在特殊情況下才需要dba幹預。人工幹預的方法由TPM供應商決定,通常的可以參考由dblink發起的分布式事務遭遇未決狀态時的處理過程。