引自:
http://act.it.sohu.com/book/chapter.php?id=387&volume=4&chapter=2
應(yīng)用程序服務(wù)器
應(yīng)用程序服務(wù)器是事務(wù)處理操作的另一個(gè)組件。應(yīng)用程序服務(wù)器處理大部分的應(yīng)用程序操作并且獲得最終用戶應(yīng)用程序的一些負(fù)載?;谇懊娴睦?,我們可以看出應(yīng)用程序服務(wù)器在事務(wù)處理上添加了另一個(gè)操作層:
到目前為止,我們的例子說明了單個(gè)的本地事務(wù)處理,并且描述了分布式事務(wù)處理模型的五個(gè)組件中的四個(gè)。第五個(gè)組件,事務(wù)管理程序只有當(dāng)事務(wù)將要被分配的時(shí)候才會(huì)開始被考慮。
分布式事務(wù)處理和事務(wù)管理程序 像我們前面所提到的,一個(gè)分布式事務(wù)處理是一個(gè)在兩個(gè)或更多網(wǎng)絡(luò)資源上訪問和更新數(shù)據(jù)的事務(wù)處理。
這些資源可以由好幾個(gè)位于一個(gè)單獨(dú)服務(wù)器上的不同的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)組成,比如說Oracle、SQL Server和Sybase;它們也可以包含存在于若干不同的服務(wù)器上的同一種數(shù)據(jù)庫的若干個(gè)實(shí)例。在任何情況下,一個(gè)分布式事務(wù)處理包括各種的資源管理程序之間的協(xié)同作用。這個(gè)協(xié)同作用是事務(wù)管理函數(shù)。
事務(wù)管理程序負(fù)責(zé)作出要么提交(commit)要么退回(rollback)任何分布式事務(wù)處理的決定。一個(gè)提交決定應(yīng)該導(dǎo)致一個(gè)成功的事務(wù)處理;而退回操作則是保持?jǐn)?shù)據(jù)庫中的數(shù)據(jù)不變。 JTA指定一個(gè)分布式事務(wù)處理中的事務(wù)管理程序和另一個(gè)組件之間的標(biāo)準(zhǔn)Java接口:應(yīng)用程序,應(yīng)用程序服務(wù)器和資源管理程序。 這個(gè)關(guān)系被顯示在下面的圖表中:
在事務(wù)管理程序周圍的數(shù)字框框相應(yīng)于JTA的三個(gè)接口部分:
1—UserTransaction—javax.transaction.UserTransaction接口提供能夠編程地控制事務(wù)處理范圍的應(yīng)用程序。 javax.transaction.UserTransaction方法開啟一個(gè)全局事務(wù)并且使用調(diào)用線程與事務(wù)處理關(guān)聯(lián)。
2—Transaction Manager—javax.transaction.TransactionManager接口允許應(yīng)用程序服務(wù)器來控制代表正在管理的應(yīng)用程序的事務(wù)范圍。
3—XAResource—javax.transaction.xa.XAResource接口是一個(gè)基于X/Open CAE Specification的行業(yè)標(biāo)準(zhǔn)XA接口的Java映射。
注意,一個(gè)限制性環(huán)節(jié)是通過JDBC驅(qū)動(dòng)程序的XAResource接口的支持。JDBC驅(qū)動(dòng)程序必須支持兩個(gè)正常的JDBC交互作用:應(yīng)用程序和/或應(yīng)用程序服務(wù)器,而且以及JTA的XAResource部分。
編寫應(yīng)用程序水平代碼的開發(fā)者不會(huì)關(guān)心分布式事務(wù)處理管理的細(xì)節(jié)。 這是分布式事務(wù)處理基本結(jié)構(gòu)的工作—應(yīng)用程序服務(wù)器、事務(wù)管理程序和JDBC驅(qū)動(dòng)程序。應(yīng)用程序代碼中唯一的需要注意的就是當(dāng)連接處于一個(gè)分布式事務(wù)范圍內(nèi)的時(shí)候,不應(yīng)該調(diào)用一個(gè)會(huì)影響事務(wù)邊界的方法。特別的是,一個(gè)應(yīng)用程序不應(yīng)該調(diào)用Connection方法commit、rollback和setAutoCommit(true),因?yàn)樗鼈儗⑵茐姆植际绞聞?wù)的基本結(jié)構(gòu)管理。
分布式事務(wù)處理 事務(wù)管理程序是分布式事務(wù)基本結(jié)構(gòu)的基本組件;然而JDBC驅(qū)動(dòng)程序和應(yīng)用程序服務(wù)器組件應(yīng)該具備下面的特征:
驅(qū)動(dòng)程序應(yīng)該實(shí)現(xiàn)JDBC 2.0應(yīng)用程序接口,包括Optional Package接口XADataSource和XAConnection以及JTA接口XAResource。
應(yīng)用程序服務(wù)器應(yīng)該提供一個(gè)DataSource類,用來實(shí)現(xiàn)與分布式事務(wù)基本結(jié)的交互以及一個(gè)連接池模塊(用于改善性能)。
分布式事務(wù)處理的第一步就是應(yīng)用程序要發(fā)送一個(gè)事務(wù)請求到事務(wù)管理程序。雖然最后的commit/rollback決定把事務(wù)作為一個(gè)簡單的邏輯單元來對待,但是仍然可能會(huì)包括許多事務(wù)分支。一個(gè)事務(wù)分支與一個(gè)到包含在分布式事務(wù)中的每個(gè)資源管理程序相關(guān)聯(lián)。因此,到三個(gè)不同的關(guān)系數(shù)據(jù)庫管理的請求需要三個(gè)事務(wù)分支。每個(gè)事務(wù)分支必須由本地資源管理程序提交或者返回。事務(wù)管理程序控制事務(wù)的邊界,并且負(fù)責(zé)最后決定應(yīng)該提交或者返回的全部事務(wù)。 這個(gè)決定由兩個(gè)步驟組成,稱為Two - Phase Commit Protocol。
在第一步驟中,事務(wù)管理程序輪詢所有包含在分布式事務(wù)中的資源管理程序(關(guān)系數(shù)據(jù)庫管理)來看看哪個(gè)可以準(zhǔn)備提交。如果一個(gè)資源管理程序不能提交,它將不響應(yīng),并且把事務(wù)的特定部分返回,以便數(shù)據(jù)不被修改。
在第二步驟中,事務(wù)管理程序判斷否定響應(yīng)的資源管理程序中是否有能夠返回整個(gè)事務(wù)的。如果沒有否定響應(yīng)的話,翻譯管理程序提交整個(gè)事務(wù)并且返回結(jié)果到應(yīng)用程序中。
開發(fā)事項(xiàng)管理程序代碼的開發(fā)者必須與所有三個(gè)JTA接口有關(guān):UserTransaction、TransactionManager和XAResource,這三個(gè)接口都被描述在
Sun JTA specification中。JDBC驅(qū)動(dòng)程序開發(fā)者只需要關(guān)心XAResource接口。這個(gè)接口是允許一個(gè)資源管理程序參與事務(wù)的行業(yè)標(biāo)準(zhǔn)X/Open XA協(xié)議的Java映射。連接XAResource接口的驅(qū)動(dòng)程序組件負(fù)責(zé)在事務(wù)管理程序和資源管理程序之間擔(dān)任"翻譯"的任務(wù)。下面的章節(jié)提供了XAResource調(diào)用的例子。