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