天天看點

XA 協定簡介

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發起的分布式事務遭遇未決狀态時的處理過程。