DTP/XA 規(guī)范及XA API調(diào)用研究
Posted on 2007-12-06 14:07 笨笨 閱讀(3047) 評(píng)論(3) 編輯 收藏 所屬分類: Java Service Request BrokerDTP/XA 規(guī)范及XA API調(diào)用研究
分布式事務(wù)(Distributed Transaction Processing/XA)規(guī)范是一個(gè)業(yè)界標(biāo)準(zhǔn)規(guī)范,它定義了分布式事務(wù)中各方角色和標(biāo)準(zhǔn)兩階段提交的協(xié)議規(guī)范(XA Protocol),該規(guī)范為廣為業(yè)界所支持(CICS/TUXEDO/Enica,后來的OTS/JTS規(guī)范以及微軟的MTS的莫不源于此。
XA規(guī)范中關(guān)鍵角色簡(jiǎn)述如下
AP: 客戶應(yīng)用程序,負(fù)責(zé)連接TM,RM,使用RM的提供的API訪問和更改數(shù)據(jù),聲明分布式事務(wù)的開始和結(jié)束階段點(diǎn)(Transaction Demarcation)。
TM: 事務(wù)管理器,負(fù)責(zé)管理、協(xié)調(diào)、準(zhǔn)備和提交分布式事務(wù),對(duì)AP的接口標(biāo)準(zhǔn)為TX接口, 并非所有的 TM 實(shí)現(xiàn)都遵循這個(gè)標(biāo)準(zhǔn), 但是都會(huì)提供類似的接口函數(shù).
RM: 資源管理器,在AP訪問數(shù)據(jù)時(shí),關(guān)聯(lián)事務(wù)相關(guān)的數(shù)據(jù)修改,并根據(jù)TM的命令提交或回滾數(shù)據(jù)修改,通常為數(shù)據(jù)庫(kù), IBM MQSeries實(shí)現(xiàn)了RM接口。
RM分為靜態(tài)和動(dòng)態(tài)兩種,靜態(tài)RM需要TM明確調(diào)用xa_start/xa_end關(guān)聯(lián)事務(wù)與RM的聯(lián)系. 動(dòng)態(tài)RM在數(shù)據(jù)發(fā)生更改時(shí),會(huì)自動(dòng)回調(diào)TM提供的ax_reg/ax_unreg函數(shù),動(dòng)態(tài)關(guān)聯(lián)到當(dāng)前活動(dòng)的分布式事務(wù)中.

XA API中定義的xa_****和ax_****函數(shù)。
ax_reg 向事務(wù)管理器注冊(cè)資源管理器。
ax_unreg 向事務(wù)管理器取消注冊(cè)資源管理器。
xa_close 終止應(yīng)用程序?qū)Y源管理器的使用。
xa_commit 通知資源管理器提交事務(wù)分支。
xa_complete 測(cè)試異步 xa 操作是否完成。
xa_end 取消線程與事務(wù)分支的關(guān)聯(lián)。
xa_forget 允許資源管理器丟棄啟發(fā)完成的事務(wù)分支的信息。
xa_open 初始化資源管理器,供應(yīng)用程序使用。
xa_prepare 請(qǐng)求資源管理器準(zhǔn)備提交事務(wù)分支。
xa_recover 獲取資源管理器已準(zhǔn)備或啟發(fā)完成的事務(wù)標(biāo)識(shí)符 (XID) 列表。
xa_rollback 通知資源管理器回滾事務(wù)分支。
xa_start 啟動(dòng)或恢復(fù)事務(wù)分支;將 XID 與資源管理器請(qǐng)求線程的未來工作關(guān)聯(lián)。
ax_ 例程可讓資源管理器調(diào)用事務(wù)管理器;所有事務(wù)管理器必須提供這些例程。在 DTP 環(huán)境中操作時(shí),xa_ 例程由資源管理器提供,并由事務(wù)管理器調(diào)用。當(dāng)應(yīng)用程序調(diào)用事務(wù)管理器以啟動(dòng)全局事務(wù)時(shí),事務(wù)管理器可以使用 xa_ 接口通知事務(wù)分支的資源管理器。
分布式事務(wù)各個(gè)階段相關(guān)API調(diào)用如下:
1 AP 通知TM打開RM連接, AP-->TM tx_open()
TM 會(huì)在該函數(shù)中調(diào)用RM提供的xa_open函數(shù),打開到RM的連接。
在TUXEDO SERVICE中,需要在tpsvrinit()函數(shù)中調(diào)用tpopen()函數(shù)完成這項(xiàng)工作。
2 AP 聲明事務(wù)開始 AP-->TM tx_begin()
在聲明后,該線程后續(xù)對(duì)RM的所有訪問和更新均屬于該事務(wù)。
對(duì)于static RM, TM 需要調(diào)用xa_start() 明確關(guān)聯(lián)事務(wù)和RM。
在TUXEDO SERVICE/CLIENT中,tpbegin()函數(shù)完成類似工作.
當(dāng)TUXEDO SERVICE被調(diào)用時(shí), 如果已經(jīng)處于事務(wù)中, TUXEDO 會(huì)自動(dòng)調(diào)用與SERVICE關(guān)聯(lián)的RM的xa_start()函數(shù)(只對(duì)于 static RM).
3 AP訪問RM,使用RM規(guī)定的API訪問,XA規(guī)范未作定義。
對(duì)于dynamic RM, 如果訪問時(shí)發(fā)生了數(shù)據(jù)更改,例如提交一個(gè)UPDATE SQL 語(yǔ)句, RM會(huì)自動(dòng)回調(diào)TM的ax_reg函數(shù)關(guān)聯(lián)到當(dāng)前事務(wù).
4 AP聲明事務(wù)分支結(jié)束
在TUXEDO SERVICE調(diào)用完成后, 自動(dòng)調(diào)用 RM 的xa_end()函數(shù)(對(duì)于static RM和未調(diào)用ax_unreg的dynamic RM)。
說明: 根據(jù)業(yè)務(wù)需要,上述2-4步驟會(huì)在不同的進(jìn)程(TUXEDO SERVICE)中重復(fù)出現(xiàn), 只要事務(wù)ID( Global XID )相同,這多個(gè)事務(wù)分支(Branch) 均被認(rèn)為屬于同一個(gè)事務(wù).
5 AP 要求提交或回滾事務(wù)(TM tx_commit/tx_rollback )
AP要求提交事務(wù)時(shí), TM 需要檢查事務(wù)狀態(tài), 確定事務(wù)并未標(biāo)記為MARKED_ROLLBACK(只能回滾),否則會(huì)回滾并報(bào)告錯(cuò)誤.
TUXEDO CLIENT/SERVICE 調(diào)用 tpcommit/tpabort 提交或回滾事務(wù).
在TUXEDO中,由于實(shí)現(xiàn)的原因,所有xa_prepare/xa_commit/xa_rollback都是由單獨(dú)的TMS進(jìn)程發(fā)起調(diào)用的, TUXEDO SERVICE 進(jìn)程不會(huì)發(fā)起相關(guān)調(diào)用.
TUXEDO配置文件中,每個(gè)TUXEDO SERVICE GROUP可以關(guān)聯(lián)一個(gè)RM和多個(gè)TMS,每個(gè)GROUP內(nèi)的SERVICE 進(jìn)程和TMS進(jìn)程啟動(dòng)時(shí)都會(huì)使用相同的 XA OpenInfo String打開到RM的連接.
標(biāo)準(zhǔn)兩階段事務(wù)提交過程:
1 (準(zhǔn)備)更改事務(wù)狀態(tài)為PREPARING, 依次調(diào)用事務(wù)關(guān)聯(lián)RM的xa_prepare(), 任意RM返回錯(cuò)誤則進(jìn)入回滾過程, RM都PREPARE完成事務(wù)狀態(tài)改變?yōu)镻REPARED.
2 (提交)更改事務(wù)狀態(tài)為COMMITTING, 記錄事務(wù)日志到硬盤中, 依次調(diào)用RM的xa_commit方法,再更新事務(wù)日志, 更改事務(wù)狀態(tài)為COMMITTED.事務(wù)提交完成.
3 (回滾)更改事務(wù)狀態(tài)為ROLLING_BACK, 依次調(diào)用事務(wù)關(guān)聯(lián)RM的的xa_rollback,更改事務(wù)狀態(tài)為ROLLED_BACK
簡(jiǎn)化一階段事務(wù)提交過程:
1 (提交)更改事務(wù)狀態(tài)為COMMITTING, 記錄事務(wù)日志到硬盤中, 調(diào)用RM的xa_commit(TMONEPHASE)方法,再更新事務(wù)日志, 更改事務(wù)狀態(tài)為COMMITTED.事務(wù)提交完成.
啟發(fā)式事務(wù)提交和回滾:
部分RM支持啟發(fā)式提交或回滾, xa_commit/xa_rollback 返回時(shí),可能會(huì)返回XA_HEUR***的值, 表明RM執(zhí)行了啟發(fā)式優(yōu)化.
此時(shí)TM需要后續(xù)調(diào)用RM的xa_forget(), 讓RM徹底釋放該事務(wù)相關(guān)的資源.
目前JSRB(Java Service Request Broker)已經(jīng)部分實(shí)現(xiàn)上述TM的功能, 項(xiàng)目繼續(xù)進(jìn)展中...: http://jsrb.sourceforge.net
參考資料:
Distributed Transaction Processing_ The XA Specification
IBM WebSphere 開發(fā)者技術(shù)期刊: 在中間件環(huán)境中配置和使用 XA
http://www.ibm.com/developerworks/cn/websphere/techjournal/0704_sood/0704_sood.html
XA接口的一階段提交與兩階段提交有何區(qū)別?
http://www-1.ibm.com/support/docview.wss?uid=csc148256d65004dc82448256d65004276f0
分布式事務(wù)(Distributed Transaction Processing/XA)規(guī)范是一個(gè)業(yè)界標(biāo)準(zhǔn)規(guī)范,它定義了分布式事務(wù)中各方角色和標(biāo)準(zhǔn)兩階段提交的協(xié)議規(guī)范(XA Protocol),該規(guī)范為廣為業(yè)界所支持(CICS/TUXEDO/Enica,后來的OTS/JTS規(guī)范以及微軟的MTS的莫不源于此。
XA規(guī)范中關(guān)鍵角色簡(jiǎn)述如下
AP: 客戶應(yīng)用程序,負(fù)責(zé)連接TM,RM,使用RM的提供的API訪問和更改數(shù)據(jù),聲明分布式事務(wù)的開始和結(jié)束階段點(diǎn)(Transaction Demarcation)。
TM: 事務(wù)管理器,負(fù)責(zé)管理、協(xié)調(diào)、準(zhǔn)備和提交分布式事務(wù),對(duì)AP的接口標(biāo)準(zhǔn)為TX接口, 并非所有的 TM 實(shí)現(xiàn)都遵循這個(gè)標(biāo)準(zhǔn), 但是都會(huì)提供類似的接口函數(shù).
RM: 資源管理器,在AP訪問數(shù)據(jù)時(shí),關(guān)聯(lián)事務(wù)相關(guān)的數(shù)據(jù)修改,并根據(jù)TM的命令提交或回滾數(shù)據(jù)修改,通常為數(shù)據(jù)庫(kù), IBM MQSeries實(shí)現(xiàn)了RM接口。
RM分為靜態(tài)和動(dòng)態(tài)兩種,靜態(tài)RM需要TM明確調(diào)用xa_start/xa_end關(guān)聯(lián)事務(wù)與RM的聯(lián)系. 動(dòng)態(tài)RM在數(shù)據(jù)發(fā)生更改時(shí),會(huì)自動(dòng)回調(diào)TM提供的ax_reg/ax_unreg函數(shù),動(dòng)態(tài)關(guān)聯(lián)到當(dāng)前活動(dòng)的分布式事務(wù)中.

XA API中定義的xa_****和ax_****函數(shù)。
ax_reg 向事務(wù)管理器注冊(cè)資源管理器。
ax_unreg 向事務(wù)管理器取消注冊(cè)資源管理器。
xa_close 終止應(yīng)用程序?qū)Y源管理器的使用。
xa_commit 通知資源管理器提交事務(wù)分支。
xa_complete 測(cè)試異步 xa 操作是否完成。
xa_end 取消線程與事務(wù)分支的關(guān)聯(lián)。
xa_forget 允許資源管理器丟棄啟發(fā)完成的事務(wù)分支的信息。
xa_open 初始化資源管理器,供應(yīng)用程序使用。
xa_prepare 請(qǐng)求資源管理器準(zhǔn)備提交事務(wù)分支。
xa_recover 獲取資源管理器已準(zhǔn)備或啟發(fā)完成的事務(wù)標(biāo)識(shí)符 (XID) 列表。
xa_rollback 通知資源管理器回滾事務(wù)分支。
xa_start 啟動(dòng)或恢復(fù)事務(wù)分支;將 XID 與資源管理器請(qǐng)求線程的未來工作關(guān)聯(lián)。
ax_ 例程可讓資源管理器調(diào)用事務(wù)管理器;所有事務(wù)管理器必須提供這些例程。在 DTP 環(huán)境中操作時(shí),xa_ 例程由資源管理器提供,并由事務(wù)管理器調(diào)用。當(dāng)應(yīng)用程序調(diào)用事務(wù)管理器以啟動(dòng)全局事務(wù)時(shí),事務(wù)管理器可以使用 xa_ 接口通知事務(wù)分支的資源管理器。
分布式事務(wù)各個(gè)階段相關(guān)API調(diào)用如下:
1 AP 通知TM打開RM連接, AP-->TM tx_open()
TM 會(huì)在該函數(shù)中調(diào)用RM提供的xa_open函數(shù),打開到RM的連接。
在TUXEDO SERVICE中,需要在tpsvrinit()函數(shù)中調(diào)用tpopen()函數(shù)完成這項(xiàng)工作。
2 AP 聲明事務(wù)開始 AP-->TM tx_begin()
在聲明后,該線程后續(xù)對(duì)RM的所有訪問和更新均屬于該事務(wù)。
對(duì)于static RM, TM 需要調(diào)用xa_start() 明確關(guān)聯(lián)事務(wù)和RM。
在TUXEDO SERVICE/CLIENT中,tpbegin()函數(shù)完成類似工作.
當(dāng)TUXEDO SERVICE被調(diào)用時(shí), 如果已經(jīng)處于事務(wù)中, TUXEDO 會(huì)自動(dòng)調(diào)用與SERVICE關(guān)聯(lián)的RM的xa_start()函數(shù)(只對(duì)于 static RM).
3 AP訪問RM,使用RM規(guī)定的API訪問,XA規(guī)范未作定義。
對(duì)于dynamic RM, 如果訪問時(shí)發(fā)生了數(shù)據(jù)更改,例如提交一個(gè)UPDATE SQL 語(yǔ)句, RM會(huì)自動(dòng)回調(diào)TM的ax_reg函數(shù)關(guān)聯(lián)到當(dāng)前事務(wù).
4 AP聲明事務(wù)分支結(jié)束
在TUXEDO SERVICE調(diào)用完成后, 自動(dòng)調(diào)用 RM 的xa_end()函數(shù)(對(duì)于static RM和未調(diào)用ax_unreg的dynamic RM)。
說明: 根據(jù)業(yè)務(wù)需要,上述2-4步驟會(huì)在不同的進(jìn)程(TUXEDO SERVICE)中重復(fù)出現(xiàn), 只要事務(wù)ID( Global XID )相同,這多個(gè)事務(wù)分支(Branch) 均被認(rèn)為屬于同一個(gè)事務(wù).
5 AP 要求提交或回滾事務(wù)(TM tx_commit/tx_rollback )
AP要求提交事務(wù)時(shí), TM 需要檢查事務(wù)狀態(tài), 確定事務(wù)并未標(biāo)記為MARKED_ROLLBACK(只能回滾),否則會(huì)回滾并報(bào)告錯(cuò)誤.
TUXEDO CLIENT/SERVICE 調(diào)用 tpcommit/tpabort 提交或回滾事務(wù).
在TUXEDO中,由于實(shí)現(xiàn)的原因,所有xa_prepare/xa_commit/xa_rollback都是由單獨(dú)的TMS進(jìn)程發(fā)起調(diào)用的, TUXEDO SERVICE 進(jìn)程不會(huì)發(fā)起相關(guān)調(diào)用.
TUXEDO配置文件中,每個(gè)TUXEDO SERVICE GROUP可以關(guān)聯(lián)一個(gè)RM和多個(gè)TMS,每個(gè)GROUP內(nèi)的SERVICE 進(jìn)程和TMS進(jìn)程啟動(dòng)時(shí)都會(huì)使用相同的 XA OpenInfo String打開到RM的連接.
標(biāo)準(zhǔn)兩階段事務(wù)提交過程:
1 (準(zhǔn)備)更改事務(wù)狀態(tài)為PREPARING, 依次調(diào)用事務(wù)關(guān)聯(lián)RM的xa_prepare(), 任意RM返回錯(cuò)誤則進(jìn)入回滾過程, RM都PREPARE完成事務(wù)狀態(tài)改變?yōu)镻REPARED.
2 (提交)更改事務(wù)狀態(tài)為COMMITTING, 記錄事務(wù)日志到硬盤中, 依次調(diào)用RM的xa_commit方法,再更新事務(wù)日志, 更改事務(wù)狀態(tài)為COMMITTED.事務(wù)提交完成.
3 (回滾)更改事務(wù)狀態(tài)為ROLLING_BACK, 依次調(diào)用事務(wù)關(guān)聯(lián)RM的的xa_rollback,更改事務(wù)狀態(tài)為ROLLED_BACK
簡(jiǎn)化一階段事務(wù)提交過程:
1 (提交)更改事務(wù)狀態(tài)為COMMITTING, 記錄事務(wù)日志到硬盤中, 調(diào)用RM的xa_commit(TMONEPHASE)方法,再更新事務(wù)日志, 更改事務(wù)狀態(tài)為COMMITTED.事務(wù)提交完成.
啟發(fā)式事務(wù)提交和回滾:
部分RM支持啟發(fā)式提交或回滾, xa_commit/xa_rollback 返回時(shí),可能會(huì)返回XA_HEUR***的值, 表明RM執(zhí)行了啟發(fā)式優(yōu)化.
此時(shí)TM需要后續(xù)調(diào)用RM的xa_forget(), 讓RM徹底釋放該事務(wù)相關(guān)的資源.
目前JSRB(Java Service Request Broker)已經(jīng)部分實(shí)現(xiàn)上述TM的功能, 項(xiàng)目繼續(xù)進(jìn)展中...: http://jsrb.sourceforge.net
參考資料:
Distributed Transaction Processing_ The XA Specification
IBM WebSphere 開發(fā)者技術(shù)期刊: 在中間件環(huán)境中配置和使用 XA
http://www.ibm.com/developerworks/cn/websphere/techjournal/0704_sood/0704_sood.html
XA接口的一階段提交與兩階段提交有何區(qū)別?
http://www-1.ibm.com/support/docview.wss?uid=csc148256d65004dc82448256d65004276f0