Cool eye

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            63 Posts :: 4 Stories :: 3 Comments :: 0 Trackbacks
           事務(wù)是一個非常重要的編程概念,使用事務(wù),可以很簡單地構(gòu)造出可靠穩(wěn)定的應(yīng)用程序,本文以許多具體的例子介紹了事務(wù)服務(wù)的概念和事務(wù)服務(wù)的具體實現(xiàn)。
            本文共分兩部分:第一部分從事務(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ù)簡述
           

          1. 事務(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ù)操作的一部分。

          可以使用異常處理來處理上述問題,代碼如下:

          try{  //從賬戶1中取款}catch(Exception e){	//如果發(fā)生錯誤,則終止操作	return;}try {	//如果第一步?jīng)]有發(fā)生錯誤,則將提取出的資金存入賬戶2	}catch(Exception e) {//如果發(fā)生錯誤,則終止這步操作,并且將從賬戶1中取出的資金再重新存回到賬戶1中return ;}

          上面這種解決方法從存在著下面的問題:

          • 程序拖沓冗長
          • 必須考慮到每一步中可能發(fā)生的每一個問題,并且要編寫錯誤處理程序來考慮如何撤銷所作的操作
          • 如果執(zhí)行的是比簡單的取款、存款操作要復(fù)雜的多的程序,那么錯誤處理程序?qū)兊秒y以控制。
          • 編寫測試程序?qū)浅@щy

          因此,需要一種事務(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。

          • 原子性( atomic):事務(wù)中包含的各項操作必須全部成功執(zhí)行或者全部不執(zhí)行。任何一項操作失敗,將導(dǎo)致整個事務(wù)失敗,其他已經(jīng)執(zhí)行的任務(wù)所作的數(shù)據(jù)操作都將被撤銷,只有所有的操作全部成功,整個事務(wù)才算是成功完成。
          • 一致性( consistent):保證了當(dāng)事務(wù)結(jié)束后,系統(tǒng)狀態(tài)是一致的。那么什么是一致的系統(tǒng)狀態(tài)?例如,如果銀行始終遵循著"銀行賬號必須保持正態(tài)平衡"的原則,那么銀行系統(tǒng)的狀態(tài)就是一致的。上面的轉(zhuǎn)賬例子中,在取錢的過程中,賬戶會出現(xiàn)負(fù)態(tài)平衡,在事務(wù)結(jié)束之后,系統(tǒng)又回到一致的狀態(tài)。這樣,系統(tǒng)的狀態(tài)對于客戶來說,始終是一致的。
          • 隔離性( isolated):使得并發(fā)執(zhí)行的事務(wù),彼此無法看到對方的中間狀態(tài)。保證了并發(fā)執(zhí)行的事務(wù)順序執(zhí)行,而不會導(dǎo)致系統(tǒng)狀態(tài)不一致。
          • 持久性( durable):保證了事務(wù)完成后所作的改動都會被持久化,即使是發(fā)生災(zāi)難性的失敗。可恢復(fù)性資源保存了一份事務(wù)日志,如果資源發(fā)生故障,可以通過日志來將數(shù)據(jù)重建起來。

          2. 事務(wù)應(yīng)用
           

          事務(wù)服務(wù)支持的應(yīng)用由下列實體組成:

          • 事務(wù)客戶(TC,Transactional Client)
          • 事務(wù)對象(TO,Transactional Objects)
          • 可恢復(fù)對象(Recoverable Objects)
          • 提供事務(wù)支持的服務(wù)器(Transactional Servers)
          • 可恢復(fù)資源服務(wù)器(Recoverable Servers)

          下圖展示了一個簡單的事務(wù)應(yīng)用,包含了基本的事務(wù)元素:


          • 事務(wù)客戶:事務(wù)客戶是一個獨立的程序,調(diào)用參與事務(wù)的多個事務(wù)對象。發(fā)起事務(wù)的程序被稱為事務(wù)發(fā)起者(Transaction Originator)。
          • 事務(wù)對象:指那些在事務(wù)范圍內(nèi)行為會被影響的對象。事務(wù)對象自身包含了對持久化數(shù)據(jù)的操作或者通過事務(wù)請求間接對持久化數(shù)據(jù)進行操作。事務(wù)服務(wù)并不要求所有的事務(wù)請求都具有事務(wù)性的行為。與事務(wù)對象相對的是非事務(wù)對象。
          • 可恢復(fù)對象(Recoverable Objects)和資源對象(Resource Objects):如果事務(wù)提交和事務(wù)的回滾將影響某個對象里面的數(shù)據(jù),那么這個對象稱為一個可恢復(fù)對象。一個對象可以是事務(wù)對象而不是可恢復(fù)對象,因為事務(wù)對象可以使用其他的可恢復(fù)對象。可恢復(fù)對象必須將自己注冊為事務(wù)服務(wù)中的一個資源對象,才可以參與到事務(wù)中。
          • 支持事務(wù)的服務(wù)器:例如應(yīng)用服務(wù)器
          • 可恢復(fù)服務(wù)器:例如數(shù)據(jù)庫

          3. 事務(wù)服務(wù)提供的功能
           

          事務(wù)服務(wù)提供下列操作:

          • 控制事務(wù)的范圍和持續(xù)時間
          • 讓多個對象參與到一個單獨的原子性事務(wù)中
          • 將對象內(nèi)部狀態(tài)的改變同事務(wù)相聯(lián)系
          • 協(xié)調(diào)事務(wù)完成

          3.1事務(wù)模型

          • 平面型事務(wù)模型整個事務(wù)是一個整體,不可劃分為子事務(wù)。
          • 嵌套式事務(wù)模型嵌套有子事務(wù),子事務(wù)中還可以嵌套有子事務(wù),整個是一個樹形結(jié)構(gòu)。旅行計劃問題:
            • 購買從美國波士頓到美國紐約的火車票
            • 購買從美國紐約到英國倫敦的飛機票
            • 購買從英國倫敦到法國巴黎的氣艇票
            • 發(fā)現(xiàn)沒有飛往法國巴黎的氣艇票
            這對于平面型事務(wù)來說,只能有一個選擇:事務(wù)失敗。這樣由于沒有飛往巴黎的氣艇票,將會取消所有的出行計劃。但是在這里,完全可以采用其他的旅行方式(購買火車票或者飛機票)來代替氣艇。因此需要一個更加健壯的事務(wù)模型來解決這個問題。可以將整個事務(wù)劃分為若干個子事務(wù),整個事務(wù)可以重新執(zhí)行單個子事務(wù)來嘗試完成事務(wù),如果最終某個單個子事務(wù)無法完成,則整個事務(wù)失敗。
          • 其他事務(wù)模型
            鎖鏈?zhǔn)侥P汀髌媸侥P偷取?

          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ù)來傳遞。

          4. 分布式事務(wù)
           

          分布式事務(wù)是指事務(wù)的參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點之上。為了實現(xiàn)分布式事務(wù),需要使用下面將介紹的兩階段提交協(xié)議。

          • 階段一:開始向事務(wù)涉及到的全部資源發(fā)送提交前信息。此時,事務(wù)涉及到的資源還有最后一次機會來異常結(jié)束事務(wù)。如果任意一個資源決定異常結(jié)束事務(wù),則整個事務(wù)取消,不會進行資源的更新。否則,事務(wù)將正常執(zhí)行,除非發(fā)生災(zāi)難性的失敗。為了防止會發(fā)生災(zāi)難性的失敗,所有資源的更新都會寫入到日志中。這些日志是永久性的,因此,這些日志會幸免遇難并且在失敗之后可以重新對所有資源進行更新。
          • 階段二:只在階段一沒有異常結(jié)束的時候才會發(fā)生。此時,所有能被定位和單獨控制的資源管理器都將開始執(zhí)行真正的數(shù)據(jù)更新。

          在分布式事務(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ù)的管理。

          • JTS規(guī)范定義了事務(wù)管理器的實現(xiàn)。JTS規(guī)范中定義的事務(wù)管理器在高層支持JTA接口規(guī)范,在底層則實現(xiàn)了OTS1.1(CORBA Object Transaction Service)的標(biāo)準(zhǔn)Java映射。OMG使用IDL(接口定義語言)定義了事務(wù)服務(wù)語言中性的實現(xiàn),JTS則對這個IDL的事務(wù)服務(wù)實現(xiàn)作了標(biāo)準(zhǔn)的Java映射。JTS使用OTS接口實現(xiàn)了互操作和移植性。OTS接口定義了一組標(biāo)準(zhǔn)的機制,使得JTS事務(wù)管理器之間可以使用IIOP(Internet InterORB協(xié)議)來生成并傳播事務(wù)上下文。
          • 從事務(wù)管理器的角度出發(fā),事務(wù)服務(wù)的具體實現(xiàn)是不需要暴露出來的,只需要定義高層接口,使得事務(wù)服務(wù)的用戶可以驅(qū)動事務(wù)界限、資源獲取、事務(wù)同步和事務(wù)恢復(fù)過程。JTA的目的是定義事務(wù)管理器所要求的本地Java接口,從而在企業(yè)級分布計算環(huán)境中支持事務(wù)管理。下圖中的小半圓代表JTA規(guī)范。


          J2EE事務(wù)服務(wù)的層次關(guān)系
           

          企業(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ù)管理器:是一個系統(tǒng)級的組件,是事務(wù)服務(wù)的訪問點。提供了一組服務(wù)和相關(guān)的管理機制,用于支持事務(wù)劃分、事務(wù)資源管理、事務(wù)同步和事務(wù)上下文的傳播。
          • 應(yīng)用服務(wù)器(或者稱為TP monitor)提供了支持應(yīng)用程序運行環(huán)境的基礎(chǔ)設(shè)施,這個運行環(huán)境包括了事務(wù)狀態(tài)管理。應(yīng)用服務(wù)器的一個例子是EJB服務(wù)器。
          • 資源管理器(通過資源適配器[Resource Adapter],資源適配器類似于數(shù)據(jù)庫連接)為應(yīng)用程序提供了對資源的訪問。資源管理器通過實現(xiàn)一組事務(wù)資源接口來參與到分布式事務(wù)中。事務(wù)管理器使用這組事務(wù)資源接口在處理事務(wù)聯(lián)系、事務(wù)完成和事務(wù)恢復(fù)的相關(guān)工作。資源管理器的一個例子是關(guān)系數(shù)據(jù)庫服務(wù)器。
          • 基于組件的事務(wù)性應(yīng)用運行在應(yīng)用服務(wù)器環(huán)境中,需要依賴應(yīng)用服務(wù)器通過事務(wù)屬性聲明設(shè)置所提供的事務(wù)管理支持。這種類型應(yīng)用的典型例子是EJB。除此之外,一些獨立的Java客戶端程序需要使用應(yīng)用服務(wù)器或事務(wù)管理器所提供的高層接口來控制事務(wù)界限。
          • 通訊資源管理器(CRM)支持事務(wù)上下文的傳播和事務(wù)服務(wù)的訪問請求。JTA文檔中沒有規(guī)定通信的要求。請參考JTS規(guī)范[2]獲得有關(guān)事務(wù)管理器之間互操作的詳細(xì)信息。

          從事務(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
           

          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ù)的管理有兩種類型:

          1. Bean自管理事務(wù)對于自管理事務(wù)的EJB,需要從EJB上下文中獲取UserTransaction的接口引用,由自己負(fù)責(zé)完成事務(wù)的開始、提交或者回滾。
            try {javax.transaction.UserTransaction userTran = ctx.getUserTransaction();userTran.begin();… //執(zhí)行事務(wù)性的程序邏輯userTran.commit();}catch(Exception e) {	userTran.rollBack();	throw new Exception("……");}
            EJB這樣處理事務(wù)稱為編程型事務(wù)。
          2. 由容器負(fù)責(zé)事務(wù)管理對于這樣的EJB,只需在其部署描述符中指定所需的事務(wù)相關(guān)屬性,便可由EJB容器代替EJB進行事務(wù)管理。這稱為聲明式事務(wù)。

          4.1.2 事務(wù)客戶端中的UserTransaction支持

          Java客戶端程序需要首先通過JNDI來獲得UserTransaction對象的引用,然后使用該對象的方法完成事務(wù)的開始、提交或者回滾。

          java.util.Properties env = …Context ctx = new InitialContext(env);Javax.transaction.UserTransaction userTran = (javax.transaction.UserTransaction)ctx.lookup("javax.transaction.UserTransaction");userTran.commit()try {	userTran.commit();}catch(Exception e) {	userTran.rollBack();	throw new Exception("……");}

          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ù)器而言這個接口是不可見的。

          posted on 2006-10-23 09:42 joeyeezhang 閱讀(279) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 高要市| 四平市| 东山县| 富顺县| 祁东县| 丰城市| 安达市| 库车县| 东山县| 泰安市| 黔江区| 罗甸县| 兴和县| 洮南市| 曲阜市| 潞西市| 晋中市| 南漳县| 夏津县| 安福县| 沅江市| 中江县| 永福县| 莱阳市| 棋牌| 泸定县| 永顺县| 博野县| 崇信县| 临沭县| 天台县| 通渭县| 云和县| 南阳市| 大港区| 崇明县| 黑水县| 安西县| 景泰县| 鄂托克旗| 九龙坡区|