第14章 EJB高級——事務處理_第1頁
第14章 EJB高級——事務處理_第2頁
第14章 EJB高級——事務處理_第3頁
第14章 EJB高級——事務處理_第4頁
第14章 EJB高級——事務處理_第5頁
已閱讀5頁,還剩48頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、EJB中的事務處理內容提要nContainer Managed Transaction (CMT)nBean Managed Transaction (BMT)EJB支持的事務種類nEJB容器支持兩種類型的事務:n容器管理的事務(CMT-Container Managed Transaction)nBean自己管理事務(BMT-Bean Managed Transaction)n兩種類型的事務不能在同一個EJB模塊中混用一、CMTnContainer Managed Transactionn程序員在Bean的源程序中沒有事務邊界控制的代碼(如事務開始、回滾、提交等)n在部署描述符中指定事務屬性

2、,由容器控制事務的邊界。n容器維護的事務是方法級的n即默認將一個方法當作一個事務執行n當方法執行的過程中,發生系統級異常,容器會自動將事務回滾,即將方法中所執行的數據庫操作結果取消。1、方法的事務屬性n一個商業方法的事務屬性在部署描述符中用標記加以規定,該標記可以具有以下屬性值:nNEVERn具有這種屬性的方法不支持事務處理nSUPPROTSn是默認值,表示該方法支持事務,當其他具有事務支持的方法調用該方法時,當前方法中執行的數據庫操作代碼將成為其他方法中事務的一部分nREQUIREDn明確聲明該方法要求容器對其進行事務處理支持,當其他具有事務支持的方法調用該方法時,這個方法中執行的數據庫操作

3、代碼也將成為事務中的一部分nREQUIRESNEWn明確要求事務支持,并且該方法執行時會產生一個新的事務nMANDATORYn該方法必須位于一個事務處理環境中,否則將拋出一個需要進行事務支持的異常2、異常處理和事務的回滾nEJB中的異常種類n系統級異常n系統級異常即運行時刻異常,這類異常的父類是RuntimeException,不需要在源代碼中用trycatch進行顯示處理n應用程序異常n應用程序異常即檢查異常,這類異常的父類是Excepetion,需要在源代碼中用trycatch進行顯示處理n如果在一個方法中要求事務處理,而在方法的執行過程中出現了異常,那么容器將按如下方式處理事務:n如果異

4、常屬于系統級異常,則容器將停止執行當前的方法,同時銷毀當前運行的會話Bean的實例,回滾事務n如果異常屬于應用程序異常,則容器不會銷毀當前會話Bean的實例,事務也不會自動回滾,而是暫時掛起,等待客戶端的處理3、CMT示例CMT示例n本示例創建一個名為Bank的EJB模塊,用于銀行的轉賬和查帳功能,其中轉賬和查帳都在數據庫中進行nBanker是一個無狀態會話Bean,主要含有以下商業方法:n商業方法trans將orgName賬號中的指定金額轉入dstName賬號:n聲明形式: public void trans(String orgName,dstName int amount)n功能: 如果

5、將orgName賬號中的金額在數據庫中減少后,存入dstName賬號時出現了問題,則該方法對應的數據庫操作會自動取消,這是由容器管理的事務完成的。n商業方法getBalance檢測指定賬號的存款余額n聲明形式: public int getBalance(String accountName) 創建TransDemo項目,加入Bank模塊加入Banker會話Bean加入商業方法將Banker加入到模塊Bank中修改BankerBean.java文件引入必要的包首先除去一些無用的注釋,加入如圖所示的注釋: ejb.resource-ref生成訪問數據源的部署描述符,本示例使用JBoss自帶的Hy

6、personic SQL數據庫,它的JNDI名稱為DefaultDS,規定這個數據源JNDI名的文件處于JBoss的啟動配置文件夾中deploy目錄中,名為hsqldb-ds.xml。 注意注意res-ref-name屬性值的格式為jdbc/數據源名稱數據源名稱加入數據源屬性ds的定義加入ejbCreate方法和相關注釋ejb.create-method注釋在Home和LocalHome接口中生成create方法聲明注意查找數據源的格式:java:comp/env這個前綴是在JNDI樹中查找任何資源都需要加入的前綴獲取到數據庫的連接,創建所需要的賬戶表account,創建后,加入兩條記錄,一個

7、賬戶名為WANG,存入200元;另一個賬戶為LI,也存入200元修改getBalance商業方法erface-method可以使得本地和遠程兩個接口中都有getBalance商業方法的定義利用PreparedStatement在賬戶表account中查詢給定用戶的賬號余額如果rs.next()返回false,則證明指定的賬號在account表中不存在,所以拋出RuntimeException異常類的實例,并利用其構造方法說明發生異常的原因是由于指定的賬號不存在修改trans商業方法(處理轉出賬號)數據庫操作:首先利用數據源獲取數據庫連接,操作賬戶記錄,從轉出賬戶orgAccoun

8、t中扣除所取金額ejb.transaction type=“required”在部署描述符中生成相關注釋,表明這個方法需要容器處理事務修改trans商業方法(處理轉入賬號)將指定金額存入轉入賬號時,首先檢測轉入賬號的原有金額。getBalance方法在給定賬號不存時拋出異常代表查找失敗在轉賬結束之后,輸出在執行trans方法時的轉出和轉入賬號的余額,用來對比在結束trans方法的執行,事務回滾后的轉出和轉入賬號的余額trans方法至此結束trans商業方法中的事務執行過程目標: 由容器維護trans方法的事務。如果前半段的轉出數據庫操作成功,而后面的轉入數據庫操作失敗,則容器的自動事務回滾應該

9、恢復前面所作的數據庫修改。 代碼中不處理轉出數據庫操作成功而轉入數據庫操作失敗的情況產生EJB Files產生EJB Files之后的部署描述中的事務屬性設置事務管理特性: 指定Container管理事務這段方法的事務描述由trans方法之前的XDoclet注釋ejb.transaction type=“required”自動產生,描述了trans方法的參數構成和事務要求,該事務由Container進行管理部署Bank模塊為了觀察方便,請點擊控制臺窗口的“清除”按鈕,將JBoss控制臺中顯示的部署消息清空創建測試客戶端修改TestBanker.java,引入必要的包調用遠程EJB組件所需的包T

10、estBanker將用圖形用戶界面處理用戶的查詢,所以引入java.awt包和事件處理包java.awt.event修改TestBanker的testBean方法用于連接遠程EJB對象的myBean在testBean方法中定義了一個內部類,用于顯示一個如右圖所示的用戶界面,便于查詢事件處理代碼(得到Banker的正確引用)由于在查詢和轉帳的操作中都要調用getBalance方法,這個方法拋出的是系統級異常,所以會導致容器銷毀當前的會話Bean,因此,在每次點擊按鈕時都要調用Home接口的create方法得到正確的會話Bean引用事件處理代碼(轉入按鈕部分)如果用戶點擊的是“轉入!”按鈕,則通過

11、遠程對象banker,調用trans商業方法進行轉賬處理事件處理代碼(查詢余額部分)當用戶轉賬之后,或用戶按了“查詢余額”按鈕,調用getBalance商業方法查詢用戶賬號的余額查詢結果顯示區事件處理代碼(異常處理部分)如果沒有發生異常,則在操作結果顯示區顯示操作成功信息操作結果顯示區發生異常時,通過檢索異常類實例,得到確切的異常信息ATM構造方法代碼窗口關閉和點擊按鈕的事件監聽的添加生成界面代碼構造ATM類的實例,顯示界面,testBean代碼到此結束。運行TestBanker.java文件TestBanker的運行初始化界面客戶端程序初始運行界面如圖,輸入賬號WANG和LI之后(注意全部是

12、大寫),點擊“查詢余額”按鈕,界面顯示WANG和LI的賬號余額正常轉賬的客戶端和服務端信息JBoss在控制臺中顯示了轉賬過程中的WANG和LI賬號變化的詳細信息,可以看出,賬號的變化信息和客戶端的顯示信息是一致的如圖,輸入轉賬金額后10后,賬號WANG和LI的賬戶余額發生了相應的變化,程序提示操作成功,同時JBoss控制臺顯示相應的轉賬的詳細信息異常轉賬時的客戶端和服務器信息將轉入賬號改為ZHANG,這個用戶在數據庫中并不存在,所以無法將WANG的金額轉入ZHANG的賬號,程序底部提示轉賬失敗。同時JBoss則在控制臺中顯示一些異常信息轉賬失敗后,重新輸入轉入賬號LI。按“查詢余額“按鈕,可以

13、看到WANG和LI的賬戶余額都沒有改變,證明事務回滾成功異常轉賬時服務端顯示的交易信息向上滾動向上滾動JBoss的控制臺窗口,可以看到服務器控制臺打印出的這次交易失敗過程:的控制臺窗口,可以看到服務器控制臺打印出的這次交易失敗過程: 由于轉入賬號不存在,WANG的賬戶轉出10后,金額由160減少到了150。從輸出信息可以看出,在本次交易中的最后,WANG的賬號并沒有因交易失敗恢復原有的數值,而是保留了轉出后的數值的數值150。但從客戶端程序中查到WANG的賬戶資金卻依舊是160。WANG賬戶金額沒有恢復的原因:賬戶金額沒有恢復的原因: 控制臺打印的信息是在商業方法trans中打印出來的,此時事

14、務還未回滾,一旦trans調用結束,EJB容器就會自動回滾事務,恢復WANG的賬戶金額。因此,當轉賬失敗后,trans方法執行結束,表中賬戶WANG的賬戶金額就會恢復到原有的160。二、BMT1、BMTnBean Managed Transactionn程序員在Bean的源程序中控制事務邊界控制(如事務開始、回滾、提交等)n在部署描述符中指定由Bean控制事務的邊界。2、BMT與會話BeannBMT只能應用于會話Bean,而不能應用在實體Bean當中n無狀態會話Bean中的事務n無狀態會話Bean由于不保存客戶端的調用狀態,所以BMT只能界定在一次商業方法調用,也就是只能事務的范圍僅能處于一個

15、商業方法中n有狀態會話Beann有狀態會話Bean中的BMT可以跨越方法的邊界,在多個方法中管理同一個事務3、BMT示例程序BMT示例程序n和CMT例子的功能相同,Banker提供銀行賬戶的轉賬和查詢nBanker的trans商業方法中的事務不再由容器控制,而是自行管理。n本示例的主體代碼與原CMT示例基本相同,所以可以在CMT示例基礎上進行修改完成修改BeankerBean.java,引入需要的類因為bean自己控制事務,所以需要在XDoclet的ejb.bean注釋中加入transaction-type項,指定其值為“Bean”,這樣在生成的部署描述符文件ejb-jar.xml中會指明事務

16、由Bean自己控制用于事務處理的UserTransaction類修改BeankerBean.java,加入相應的方法加入context成員,用于保存容器傳遞的SessionContext引用。在bean自己控制事務時,需要利用該對象獲得用戶事務的引用。注意:注意:不要省略setSessionContext方法上方的JavaDoc注釋,它被子類中的setSessionContext方法用于對本類當前方法進行調用。如果沒有該語句,則當前這個setSessionContext方法就不會被容器所調用修改trans方法,加入顯式事務控制控制事務開始由于是由Bean自身控制事務,所以不再需要加入ejb.t

17、ranstraction type=“required”注釋修改trans方法,加入事務提交語句正常完成后提交事務修改trans方法,發生異常時回滾事務發生異常,將事務回滾trans中的事務處理整體示意正常提交異常回滾事務開始生成EJB FilesEJB-JAR.XML文件中的事務聲明標志中的值為Bean,該標志由類級注釋ejb.bean transaction-type = “Bean”生成部署Bank模塊為了觀察方便,請點擊控制臺窗口的“清除”按鈕,將JBoss控制臺中顯示的部署消息清空再次運行客戶端如圖,輸入賬號WANG和LI之后(注意全部是大寫),點擊“查詢余額”按鈕,界面顯示WANG

18、和LI的賬號余額如圖,輸入轉賬金額后10后,賬號WANG和LI的賬戶余額發生了相應的變化,程序提示操作成功服務器端控制臺顯示的具體轉賬信息JBoss的運行控制臺中顯示了轉賬過程的具體細節信息,對比轉賬前和轉賬后的客戶端界面,可以看出賬戶WANG和賬戶LI資金金額的變化情況轉賬前轉賬后轉賬失敗界面將轉入賬號改為ZHANG,按“轉入!”按鈕,程序提示操作失敗,同時JBoss的控制臺中顯示了異常信息點擊滾動JBoss的控制臺窗口,可以看到更為詳細的轉賬失敗信息JBoss控制臺中打印的轉賬失敗的詳細信息可以看出,本次轉賬過程中,賬號WANG中的金額在轉賬前為150,取出10元后,數據庫中的數據為140,但由于轉入賬號ZHANG并不存在,所以事務回滾。由于是Bean自身控制事務,所以WANG的賬戶金額直接恢復成了150,這和CMT的示例有所不同。在CMT示例中,WANG的賬號資金并沒有直接恢復原有金額,而是在trans方法執行結

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論