本文共分兩部分:第一部分從事務(wù)服務(wù)整體描述的角度簡要介紹了事務(wù)服務(wù)產(chǎn)生的動機、事務(wù)服務(wù)的應(yīng)用和事務(wù)服務(wù)的功能,其中以具體的例子解釋了相關(guān)概念和事務(wù)服務(wù)涉及到的一些術(shù)語;第二部分以J2EE中的事務(wù)服務(wù)為例對事務(wù)的實現(xiàn)作簡要的介紹。
第I部分 事務(wù)服務(wù)簡述 事務(wù)是一個非常重要的編程概念,使用事務(wù),可以很簡單地構(gòu)造出可靠穩(wěn)定的應(yīng)用程序,尤其對那些需要進行并發(fā)數(shù)據(jù)訪問的應(yīng)用程序,事務(wù)更是重要的多。事務(wù)的概念最初應(yīng)用在那些用于商務(wù)操作的應(yīng)用程序上,在這些應(yīng)用中,事務(wù)用來保護中央數(shù)據(jù)庫中的數(shù)據(jù)。隨后,隨著分布式計算的發(fā)展,事務(wù)在分布式計算領(lǐng)域中也得到了廣泛的應(yīng)用。現(xiàn)在,在分布式計算領(lǐng)域中,公認(rèn)為事務(wù)是構(gòu)造可靠性分布式應(yīng)用程序的關(guān)鍵。 1.1事務(wù)產(chǎn)生的動機 1.1.1原子操作 考慮這樣一個應(yīng)用:用戶把錢從一個銀行賬號轉(zhuǎn)賬至另一個銀行賬號,需要將資金從一個銀行賬號中取出,然后再存入另一個銀行賬號中。理想來說,這兩次操作都應(yīng)該成功。但是,如果有錯誤發(fā)生,則兩次操作都應(yīng)該失敗,否則的話,操作之后其中一個賬號中的金額將會是錯誤的,整個操作過程應(yīng)該是原子性的,兩個操作都是一個原子事務(wù)操作的一部分。 可以使用異常處理來處理上述問題,代碼如下:
上面這種解決方法從存在著下面的問題:
因此,需要一種事務(wù)處理機制來保證這種原子性的操作。 1.1.2 網(wǎng)絡(luò)故障或機器故障 為了在發(fā)生嚴(yán)重故障之后,能夠保證系統(tǒng)的狀態(tài)是一致的,所以需要一種恢復(fù)性的機制來保證這一點。 1.1.3 數(shù)據(jù)共享 需要一種機制來保證多用戶并發(fā)訪問數(shù)據(jù)的問題。 以上這些問題的解決方法,便是使用事務(wù)服務(wù)。 1.2 使用事務(wù)服務(wù)帶來的好處 使用事務(wù),便可以利用事務(wù)的四個重要屬性:ACID。
事務(wù)服務(wù)支持的應(yīng)用由下列實體組成:
下圖展示了一個簡單的事務(wù)應(yīng)用,包含了基本的事務(wù)元素:
事務(wù)服務(wù)提供下列操作:
3.1事務(wù)模型
3.2 事務(wù)的終止 通過發(fā)出提交請求或回滾請求來終止事務(wù)。通常,事務(wù)是由發(fā)起事務(wù)的客戶(事務(wù)發(fā)起者)來終止的。 3.3事務(wù)的完整性 某些事務(wù)服務(wù)的實現(xiàn)為了保證事務(wù)的完整性,在事務(wù)服務(wù)接口的使用上施加了一些限制。這稱為checked事務(wù)行為。例如,在事務(wù)的所有任務(wù)完成之前提交事務(wù)會導(dǎo)致數(shù)據(jù)不完整。事務(wù)服務(wù)的Checked實現(xiàn)會阻止事務(wù)的過早提交。其他事務(wù)服務(wù)的實現(xiàn)則完全依賴應(yīng)用程序來提供事務(wù)的完整性保證,這稱為unchecked事務(wù)行為。 3.4事務(wù)的上下文 事務(wù)上下文惟一標(biāo)識了一個事務(wù),保存了事務(wù)的當(dāng)前狀態(tài)。通過查詢事務(wù)上下文,可以得知自身是否處于事務(wù)中,所在事務(wù)的狀態(tài)以及其他一些有用的信息。 事務(wù)上下文可以作為事務(wù)操作調(diào)用的一部分隱式地傳遞給事務(wù)對象。事務(wù)服務(wù)也允許程序員將事務(wù)上下文作為事務(wù)請求的顯示參數(shù)來傳遞。 分布式事務(wù)是指事務(wù)的參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點之上。為了實現(xiàn)分布式事務(wù),需要使用下面將介紹的兩階段提交協(xié)議。
在分布式事務(wù)兩階段提交協(xié)議中,有一個主事務(wù)管理器負(fù)責(zé)充當(dāng)分布式事務(wù)協(xié)調(diào)器的角色。事務(wù)協(xié)調(diào)器負(fù)責(zé)整個事務(wù)并使之與網(wǎng)絡(luò)中的其他事務(wù)管理器協(xié)同工作。 為了實現(xiàn)分布式事務(wù),必須使用一種協(xié)議在分布式事務(wù)的各個參與者之間傳遞事務(wù)上下文信息,IIOP便是這種協(xié)議。這就要求不同開發(fā)商開發(fā)的事務(wù)參與者必須支持一種標(biāo)準(zhǔn)協(xié)議,才能實現(xiàn)分布式的事務(wù)。 以上從事務(wù)整體描述的角度簡要介紹了事務(wù)服務(wù)產(chǎn)生的動機、事務(wù)服務(wù)的應(yīng)用和事務(wù)服務(wù)的功能,下面以J2EE中的事務(wù)服務(wù)為例對事務(wù)的實現(xiàn)作簡要的介紹。 |
第II部分 J2EE中的事務(wù)服務(wù) Java TM2 Platform, Enterprise Edition(J2EE)簡化了分布式事務(wù)管理應(yīng)用程序的編寫。J2EE包括了兩套規(guī)范,用來支持分布式的事務(wù),一種是Java Transaction API(JTA),另一種是Java Transaction Service(JTS)。JTA是一種高層的,與實現(xiàn)無關(guān)的,與協(xié)議無關(guān)的API,應(yīng)用程序和應(yīng)用服務(wù)器可以使用JTA來訪問事務(wù)。JTS則規(guī)定了支持JTA的事務(wù)管理器的實現(xiàn)規(guī)范,在高層API之下實現(xiàn)了OMG Object Transaction Service(OTS) 1.1規(guī)范的Java映射。JTS使用Internet Inter-ORB Protocol(IIOP)來傳播事務(wù)。作為J2EE平臺實現(xiàn)的一部分,SUN實現(xiàn)了一個支持JTS的事務(wù)管理器,同時還實現(xiàn)了JTA。 JTA和JTS讓J2EE應(yīng)用服務(wù)器完成事務(wù)管理,這樣就使得組件開發(fā)人員擺脫了事務(wù)管理的負(fù)擔(dān)。開發(fā)者只需在部署描述符中聲明事務(wù)管理屬性,便可以使得EJB組件參與到事務(wù)之中,由應(yīng)用服務(wù)器來負(fù)責(zé)事務(wù)的管理。
企業(yè)級Java中間件的分布式事務(wù)服務(wù)包括五層:事務(wù)管理器(Transaction Manager)、應(yīng)用服務(wù)器(Application Server)、資源管理器(Resource Manager)、應(yīng)用程序(Application Program)和通信資源管理器(Communication Resource Manager)。每一層都通過實現(xiàn)一組事務(wù)API和相關(guān)機制參與到分布式事務(wù)處理系統(tǒng)中。
從事務(wù)管理器的角度出發(fā),事務(wù)服務(wù)的具體實現(xiàn)是不需要暴露出來的,只需要定義高層接口,使得事務(wù)服務(wù)的用戶可以驅(qū)動事務(wù)界限、資源獲取、事務(wù)同步和事務(wù)恢復(fù)過程。JTA的目的是定義事務(wù)管理器所要求的本地Java接口,從而在企業(yè)級分布計算環(huán)境中支持事務(wù)管理。下圖中的小半圓代表JTA規(guī)范。 JTS中規(guī)定的事務(wù)管理器的實現(xiàn) 本節(jié)從事務(wù)管理器實現(xiàn)者的角度描述了實現(xiàn)方面的要求。如下圖,事務(wù)管理器必須實現(xiàn)JTA接口,用于支持應(yīng)用服務(wù)器和資源管理器。不要求實現(xiàn)對JDBC 1.0 Driver和非JTA資源管理器支持。也不要求實現(xiàn)對各種CORBA應(yīng)用實體的支持,如事務(wù)客戶端(Transactional Client)、事務(wù)服務(wù)器(Transactional Server)和恢復(fù)服務(wù)器(Recoverable Server)。 Java Transaction API由三部分組成:高層的應(yīng)用事務(wù)劃分接口(供事務(wù)客戶使用)、高層的事務(wù)管理器接口(供應(yīng)用服務(wù)器使用)和X/Open XA協(xié)議的標(biāo)準(zhǔn)Java映射(供事務(wù)性資源管理器使用)。 4.1 UserTransaction接口 Javax.transaction.UserTransaction接口使得應(yīng)用程序能夠編程控制事務(wù)邊界。這個接口可以由Java客戶端程序或者EJB來使用。 4.1.1在EJB Server中的UserTransaction支持 EJB中對事務(wù)的管理有兩種類型:
4.1.2 事務(wù)客戶端中的UserTransaction支持 Java客戶端程序需要首先通過JNDI來獲得UserTransaction對象的引用,然后使用該對象的方法完成事務(wù)的開始、提交或者回滾。
4.2 TransactionManager接口 應(yīng)用服務(wù)器使用javax.transaction.TransactionManager接口來代表受控的應(yīng)用程序控制事務(wù)的邊界。例如,EJB容器為事務(wù)性EJB組件管理事務(wù)狀態(tài)。 4.3 Transaction接口 使用Transaction接口可以執(zhí)行與目標(biāo)對象相關(guān)聯(lián)的事務(wù)操作。 4.4 XAResource接口 Javax.transaction.xa.XAResource接口是基于X/Open CAE規(guī)范(分布式事務(wù)處理:XA規(guī)范)工業(yè)標(biāo)準(zhǔn)XA接口的Java映射。 XAResource接口定義了分布式事務(wù)處理環(huán)境(DTP)中資源管理器和事務(wù)管理器之間是如何交互的。資源管理器的資源適配器實現(xiàn)了XAResource接口,將事務(wù)同事務(wù)資源聯(lián)系起來,類似關(guān)系數(shù)據(jù)庫的一個連接。 4.5 Xid接口 Javax.transaction.xa.Xid接口是X/Open事務(wù)標(biāo)識符XID結(jié)構(gòu)的Java映射。這個接口由事務(wù)管理器和資源管理器來使用,對于應(yīng)用程序和應(yīng)用服務(wù)器而言這個接口是不可見的。 |