Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
          容器管理事務(Container-Managed Transaction, CMT ):容器管理事務允許組件自動征集(enlist )到事務中,也就是說,EJB 組件從不需要顯式地給出begin 、commit 、abort 語句,EJB 容器會替開發(fā)者考慮這些內(nèi)容。EJB 容器會依據(jù)EJB 組件提供者指定的事務行為來界定相應的事務邊界。在使用容器管理事務時,EJB 容器會攔截客戶請求,并自動為EJB 組建啟動新的事務,也就是說,容器會通過begin 語句調(diào)用底層事務系統(tǒng),從而啟動事務。隨后,容器會將業(yè)務請求委派給EJB 組件,組件中的業(yè)務操作將運行在這一事務中。處于事務中的EJB 組件能夠執(zhí)行任何業(yè)務邏輯,如寫入數(shù)據(jù)庫、發(fā)送異步信息、調(diào)用其他的EJB 組件等。一旦在處理業(yè)務過程中出現(xiàn)問題,則EJB 組建需要通知EJB 容器去回滾事務。當EJB 組建完成業(yè)務處理后,會將控制權交回給EJB 容器。隨后,EJB 容器能夠通過commit 或abort 語句調(diào)用底層事務系統(tǒng)。

          通過使用@TransactionAttribute 注釋或部署描述符,開發(fā)者能夠指定事務屬性。EJB 容器通過分析事務屬性便能夠知道如何處理EJB 組件的事務需求。EJB 事務屬性的取值有:

          (1 )Required ,如果EJB 組件必須總是運行在事務中,則應該使用Required 模式。如果已經(jīng)有事務在運行,則EJB 組件參與其中;如果沒有事務運行,則EJB 容器會為EJB 組件啟動新的事務。

          Required 是默認和最常使用的事務屬性值。這個值指定必須在事務之內(nèi)調(diào)用EJB 方法。如果從非事務性客戶端調(diào)用方法,那么容器會在調(diào)用方法之前開始事務,并且在方法返回時結束事務。另一方面,如果調(diào)用者從事務性上下文調(diào)用方法,那么 方法會聯(lián)結已有事務。在從客戶段傳播事務的情況下,如果我們的方法表示應該回滾事務,那么容器不僅回回滾整個事務,而且會向客戶端拋出異常,從而讓客戶端 知道它開始的事務已經(jīng)被另一個方法回滾了。

          (2 )Requires_New ,當客戶調(diào)用EJB 時,如果總是希望啟動新的事務,則應該使用RequiresNew 事務屬性,如果客戶在調(diào)用EJB 組件時已經(jīng)存在事務,則當前事務會被掛起,進而容器啟動新的事務,并將調(diào)用請求委派給EJB 組件。也就是說,如果客戶端已經(jīng)有了事務,那么它暫停該事務,知道方法返回位置,新事務是成功還是失敗都不會影響客戶端已有的事務。EJB 組件執(zhí)行相應的業(yè)務操作,容器會提交或回滾事務,最終容器將恢復原有的事務,當然,如果客戶在調(diào)用EJB 組件時不存在事務,則不需要執(zhí)行事務的掛起或恢復操作。

          RequiresNew 事務屬性非常有用。如果EJB 組件需要事務的ACID 屬性,并且將EJB 組件運行在單個獨立的工作單元中,從而不會將其他外部邏輯也包括在當前的事務中,則必須使用RequiredNew事 務屬性。如果需要事務,但是不希望事務的回滾影響客戶端,就應該使用它。另外,當不希望客戶端的回滾影響你的時候,也應該使用這個值。日志記錄是個很好的 例子,即使父事務回滾,你也希望把錯誤情況記錄到日志中,另一方面,日志記錄細小調(diào)試信息的失敗不應該導致回滾整個事務,并且問題應該僅限于日志記錄組件 內(nèi)。

          (3 )Supports ,如果某個EJB 組件使用了Supports 事務屬性,則只有調(diào)用它的客戶已經(jīng)啟用了事務時,這一EJB 組件才會運行在事務中。如果客戶并沒有運行在事務中,則EJB 組建也不會運行在事務中。Supports 同Required 事務屬性很相似,但是,Required 要求EJB 組件必須運行在事務中。如果使用Support 事務屬性,EJB 組建很可嫩沒有運行在事務中。

          (4 )Mandatory ,Mandatory 事務屬性要求調(diào)用EJB 組件的客戶必須已經(jīng)運行在事務中。如果從非事務性客戶端調(diào)用使用Mandatory 屬性的EJB 方法,那么客戶將接受到系統(tǒng)拋出的javax.ejb.EJBTransactionRequiredException 異常。EJB 組件使用Mandatory 事務屬性是非常安全的,它能夠保證EJB 組建運行在事務中。如果客戶沒有運行在事務中,則不能夠調(diào)用到應用了Mandatory 事務屬性的EJB 組件。但是,Mandatory 事務屬性要求第3 方(及客戶)在調(diào)用EJB 組件前必須啟動了事務。EJB 容器并不會為Mandatory 事務屬性自動啟動新事務,這是同Support 事務屬性的最主要區(qū)別。

          (5 )NotSupported ,如果EJB 組件使用了NotSupport 事務屬性,它根本不會參與到事務中。如果調(diào)用者使用相關聯(lián)的事務調(diào)用方法,容器就會暫停事務,調(diào)用方法,然后再方法返回時恢復事務。通常,此屬性只用于非實物性的自動確認模式中,支持JMS 提供者的MDB 。

          (6 )Never ,如果EJB 組件使用Never 事務屬性,它就不能夠參與到事務中,而且,如果調(diào)用它的客戶已經(jīng)處于事務中,則容器會將javax.ejb.EJBException 異常拋給客戶。

          事務效果圖,其中,T1 和T2 是2 個不同的事務,T1 是客戶請求傳遞的事務,T2 是容器啟動的事務,通過下表,能夠理解各種事務屬性在影響事務長度和范圍方面所起的重要作用。

          事務屬性

          客戶事務

          EJB 組件事務

          Required

          T1

          T2

          T1

          RequiresNew

          T1

          T2

          T2

          Supports

          T1

          T1

          Mandatory

          T1

          錯誤

          T1

          NotSupported

          T1

          Never

          T1

          錯誤

          posted on 2009-07-20 09:37 seal 閱讀(307) 評論(0)  編輯  收藏 所屬分類: EJB
          主站蜘蛛池模板: 剑川县| 康定县| 灵山县| 怀柔区| 会东县| 和平区| 桑植县| 浦东新区| 边坝县| 库尔勒市| 辉县市| 安多县| 闻喜县| 德州市| 神农架林区| 贵州省| 台州市| 开封县| 海林市| 龙游县| 望都县| 托克逊县| 新河县| 永胜县| 龙州县| 上犹县| 皮山县| 钟山县| 河西区| 东明县| 高平市| 邵阳市| 大石桥市| 双流县| 三都| 衡水市| 崇义县| 武冈市| 鄄城县| 兴国县| 邵武市|