Sealyu

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

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

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

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

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

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

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

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

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

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

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

          事務(wù)效果圖,其中,T1 和T2 是2 個(gè)不同的事務(wù),T1 是客戶請(qǐng)求傳遞的事務(wù),T2 是容器啟動(dòng)的事務(wù),通過(guò)下表,能夠理解各種事務(wù)屬性在影響事務(wù)長(zhǎng)度和范圍方面所起的重要作用。

          事務(wù)屬性

          客戶事務(wù)

          EJB 組件事務(wù)

          Required

          無(wú)

          T1

          T2

          T1

          RequiresNew

          無(wú)

          T1

          T2

          T2

          Supports

          無(wú)

          T1

          無(wú)

          T1

          Mandatory

          無(wú)

          T1

          錯(cuò)誤

          T1

          NotSupported

          無(wú)

          T1

          無(wú)

          無(wú)

          Never

          無(wú)

          T1

          無(wú)

          錯(cuò)誤

          posted on 2009-07-20 09:37 seal 閱讀(307) 評(píng)論(0)  編輯  收藏 所屬分類: EJB
          主站蜘蛛池模板: 织金县| 交口县| 河东区| 定安县| 宜君县| 平安县| 永和县| 抚州市| 绥德县| 娄烦县| 扶沟县| 浦北县| 科尔| 陕西省| 中超| 布尔津县| 三穗县| 蕉岭县| 忻城县| 明光市| 突泉县| 宿迁市| 吴忠市| 县级市| 安阳市| 扬中市| 甘孜县| 永春县| 北安市| 永福县| 阿拉善左旗| 响水县| 楚雄市| 垦利县| 临夏县| 多伦县| 东乌珠穆沁旗| 石阡县| 平武县| 东乡族自治县| 朝阳市|