<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    2009年6月6日

    總結(jié)(2)是針對(duì)EJB3的事務(wù)和安全中的容器管理事務(wù)(CMT),BMT及安全部分放在總結(jié)(3)中。
    完全是自己學(xué)習(xí)的心得,還請(qǐng)前輩們指點(diǎn)。

     

    EJB3的事務(wù)與安全

    EJB3的是事務(wù)也符合ACID,即原子性、一致性、隔離型、持久性。這些特性與數(shù)據(jù)庫事務(wù)一致,需要強(qiáng)調(diào)的是一致性,在事務(wù)開始前,系統(tǒng)是處于一種遵守業(yè)務(wù)規(guī)則和約束的一致狀態(tài)下,那么在事務(wù)提交或回滾之后,系統(tǒng)也必須維持這種一致性狀態(tài)。在事務(wù)進(jìn)行過程中不必處于不一致性狀態(tài),事務(wù)在這里就像一個(gè)沙箱(sand-box)。

    EJB中,事務(wù)也具有隔離級(jí)別的控制,但一般不用通過EJB容器來控制,而是在數(shù)據(jù)庫資源這一級(jí)別來進(jìn)行控制。

     

    要知道在EJB容器中,代碼層面的所有操作最終都是轉(zhuǎn)化為兩級(jí)的數(shù)據(jù)庫操作,比如鎖定和解鎖數(shù)據(jù)庫中的某行或某張表。事務(wù)日志來反映事務(wù)的變化,開始事務(wù)日志代表事務(wù)的開始,應(yīng)用日志代表以提交該事務(wù)來結(jié)束,相反放棄日志就代表回滾事務(wù)而結(jié)束。

     

    資源管理器(Resource Manager)的概念是管理特定某種資源的事務(wù)的組件。這個(gè)概念不僅包括關(guān)系數(shù)據(jù)庫系統(tǒng),也可以使消息服務(wù)器或其他業(yè)務(wù)系統(tǒng)。

     

    如果只涉及一種單一資源的事務(wù)就稱為local transaction本地事務(wù),相反大多數(shù)企業(yè)應(yīng)用都是需要涉及多種不同的資源。這時(shí)候就需要一種類型的組件來管理事務(wù)中多種資源,這個(gè)組件稱為事務(wù)管理器(Transaction Manager),它在多個(gè)管理各自資源事務(wù)的資源管理之間進(jìn)行協(xié)調(diào)和控制。

     

    分布式的事務(wù)管理是通過一種稱為兩段式提交(two-phase commit)的機(jī)制來完成。現(xiàn)在最為流行的分布式事務(wù)協(xié)議是XA協(xié)議(XA Protocol),JavaEE就是通過該協(xié)議來完成分布式應(yīng)用中的事務(wù)管理。

     

    事務(wù)管理

    JavaEE中事務(wù)使用JTAJava Transaction API,是建立在Java Transaction Service之上的服務(wù)),即javax.tranaction.UserTransaction接口,容器在后臺(tái)會(huì)自動(dòng)管理大多數(shù)事務(wù)細(xì)節(jié),EJB開發(fā)者只需控制開始和停止事務(wù)、建立事務(wù)邊界(transaction boundary)以及是否提交/回滾業(yè)務(wù)即可。

    EJB3中提供了兩種具體的事務(wù)方式,即容器管理的事務(wù)(Container-managed transactionCMT)和bean管理的事務(wù)(Bean-managed transactionBMT)。其中前者是使用聲明式地或通過部署描述符來管理事務(wù);后者需要以顯式編碼的方式來管理。但需要注意的是在EJB3中,只有SessionBeanMessageDrivenBean才支持CMTBMTJPA中并不直接依賴CMTBMT。但是當(dāng)然,在任何JavaEE容器中都可透明得插入CMTBMT的事務(wù)環(huán)境。

    EJB3中管理事務(wù)最簡(jiǎn)單靈活的方式是采用容器管理事務(wù),即CMT

     

    容器管理的事務(wù),顧名思義,容器來做“事務(wù)開始、事務(wù)提交或回滾”。容器在調(diào)用方法前開始JTA事務(wù),接著會(huì)調(diào)用業(yè)務(wù)方法,最后根據(jù)調(diào)用中發(fā)生的情況去決定是提交事務(wù)還是回滾事務(wù)。使用CMT事務(wù)管理,只需關(guān)注@TransactionManagement@TransactionAttribute注解,同時(shí)通過EJBContext的方法來回滾事務(wù)。

     

    1@TransactionMangement注解用于向容器標(biāo)識(shí)該bean的事務(wù)管理是使用CMT還是BMT,是通過該標(biāo)簽中的value屬性來指明TransactionManagementType的枚舉值。

     

    2@TransactionAttribute注解,盡管由容器為我們來管理事務(wù)的各種細(xì)節(jié),但是仍然需要通過該注解來告知容器如何去自動(dòng)管理。

    CMT對(duì)事務(wù)的管理可以在包裝bean的方法時(shí)開始,也可以從調(diào)用者的事務(wù)中進(jìn)行join開始。

    TransactionAttributeType有幾個(gè)枚舉值:

    (1)      REQUIRED:如果調(diào)用者沒有事務(wù),容器則創(chuàng)建新事務(wù);如果調(diào)用者具有事務(wù),容器則連接join調(diào)用者事務(wù)。

    (2)      REQUIRED_NEW:如果調(diào)用者沒有事務(wù),容器就創(chuàng)建新事務(wù);如果調(diào)用者有事務(wù),容器暫停原來事務(wù),并創(chuàng)建新的事務(wù)。

    (3)      SUPPORTS:如果調(diào)用者沒有事務(wù),容器就不創(chuàng)建事務(wù);反之則join并使用調(diào)用者的事務(wù)。

    (4)      MANDATORY:如果調(diào)用者沒有事務(wù),容器拋出javax.ejb.EJBTransactionRequiredException異常;反之則連接并使用調(diào)用者的事務(wù)。

    (5)      NOT_SUPPORTED:如果調(diào)用者沒有事務(wù),容器便不使用事務(wù)調(diào)用方法;反之則暫停調(diào)用者事務(wù)以non-transactional的方式調(diào)用方法。

    (6)      NEVER:如果調(diào)用者沒有事務(wù),容器直接調(diào)用方法;反正拋出javax.ejb.EJBException異常。

     

    a.    對(duì)于第1種情況,適合的場(chǎng)景是從non-transactionalWeb層調(diào)用bean方法,如果方法調(diào)用出現(xiàn)異常,那么容器不僅會(huì)rollback整個(gè)事務(wù),同時(shí)也會(huì)向調(diào)用者拋出javax.transaction.RollbackException異常,以通知調(diào)用者事務(wù)已被回滾了。

    b.    2種情況中,始終需要容器去創(chuàng)建新的事務(wù),對(duì)于調(diào)用者原有的事物,容器就會(huì)暫停它,直到方法調(diào)用返回為止就恢復(fù)原有事務(wù)。這樣的結(jié)果就是方法調(diào)用所創(chuàng)建的新事務(wù)無論成功與否,都不會(huì)對(duì)調(diào)用者原有的事務(wù)造成影響。

    c.    SUPPORT選項(xiàng)表示本質(zhì)上容器將會(huì)按照調(diào)用者的事務(wù)情況來處理,通常的場(chǎng)景是用于一些只讀型的操作,比如檢索數(shù)據(jù)記錄等。

    d.    MANDATORY表示對(duì)容器對(duì)事務(wù)的強(qiáng)制性要求,如果調(diào)用者存在事務(wù),容器就join并使用調(diào)用者事務(wù);但如果調(diào)用者沒有事務(wù)環(huán)境,就會(huì)拋出EJBTransactionRequiredException異常。這種選項(xiàng)適合于如果方法調(diào)用失敗進(jìn)行回滾時(shí)也保證調(diào)用者環(huán)境的失敗。

    e.    對(duì)于NOT_SUPPORT,容器處理的本質(zhì)是要求不能在事務(wù)環(huán)境下調(diào)用bean方法。如果調(diào)用者存在事務(wù),容器會(huì)先暫停它,然后開始方法調(diào)用,在返回后恢復(fù)調(diào)用者的事務(wù)。

    f.    NEVER表明在CMT中,容器不能允許從事務(wù)性環(huán)境中調(diào)用bean方法,否則會(huì)拋出EJBException異常。

     

    對(duì)于前面這六種TransactionAttributeTypeMDB并不是全部都支持,它支持REQUIREDNOT_SUPPORT兩種。這一點(diǎn)與MDB的特性有關(guān):客戶端無法直接調(diào)用MDB,所以事務(wù)屬性中的SUPPORTREQUIRED_NEWMANDATORY就沒有意義。

    CMT事務(wù)管理的真正機(jī)制

    很重要的一點(diǎn):CMT方法要求容器回滾事務(wù)并不是立即進(jìn)行的,而是向容器設(shè)置回滾標(biāo)識(shí),在事務(wù)結(jié)束的時(shí)候,容器檢查該標(biāo)志,如果不需回滾則提交該事務(wù),如果需要回滾則進(jìn)行。

    通過EJBContext或其子類:SessionContextMessageDrivenContextsetRollbackOnly()方法,將回滾標(biāo)志位置為true,當(dāng)方法調(diào)用結(jié)束時(shí),容器檢查該狀態(tài)以判斷是否提交事務(wù)或是回滾事務(wù)。

    需要注意的一點(diǎn)是,本質(zhì)上,使用EJBContext進(jìn)行設(shè)置標(biāo)志位時(shí),它是作為底層事務(wù)的一個(gè)上層抽象代理。所以使用時(shí),必須保證有底層事務(wù)存在,也就是說必須在REQUIRED,REQUIRED_NEW,MADATORY這三種事務(wù)屬性下使用!因?yàn)檫@三種事務(wù)屬性都可以使容器保證底層事務(wù)的存在,即無論方法調(diào)用者是否存在事務(wù)環(huán)境,容器都會(huì)創(chuàng)建新事務(wù)。

    setRollbackOnly()方法對(duì)應(yīng)的是getRollbackOnly()方法,該方法返回當(dāng)前EJBContext中回滾標(biāo)志位的狀態(tài)。該方法在業(yè)務(wù)處理中十分有用,考慮這樣一個(gè)場(chǎng)景:

    在進(jìn)行一段非常長(zhǎng)的資源密集型操作前如果前事務(wù)的前部分已經(jīng)失敗,那就是在一個(gè)注定要回滾的事務(wù)上付出很多代價(jià)。所以在這類操作之前應(yīng)該先check一下rollbackOnly是否已經(jīng)置為true

    此外,處理該標(biāo)志位狀態(tài)的代碼經(jīng)常分布在業(yè)務(wù)邏輯的catch塊中,如果catch了某種exception,則一邊記錄進(jìn)log,一邊通過set方法置狀態(tài)位。在EJB3中,可以通過@ApplicationException注解使得“捕獲異常轉(zhuǎn)化為事務(wù)回滾”變成透明的機(jī)制。

    @AplicationException注解

    @javax.ejb.ApplicationException該注解可以用來控制事務(wù)性輸出,將要拋出的異常類型在定義時(shí)加上該標(biāo)簽,同時(shí)設(shè)置該標(biāo)簽的rollback屬性,即@ApplicationException(rollback=true/false)。應(yīng)用異常(ApplicationException)是希望調(diào)用者或客戶端處理的,一般認(rèn)為除了java.rmi.RemoteExceptionjava.lang.RuntimeException之外都是應(yīng)用異常。而從上述兩種異常繼承出的子類異常都被認(rèn)為是系統(tǒng)異常,這種異常不會(huì)傳遞給調(diào)用者或客戶端而是wrappedEJBException中。

    添加此注解的異常無論是checked exception還是unchecked exception(比如運(yùn)行時(shí)異常),都會(huì)被認(rèn)為是應(yīng)用異常(application exception),從而傳遞給方法調(diào)用者或客戶端。

    默認(rèn)情況下,所有checked exception或所有被注解為應(yīng)用異常的checked/unchecked exception,都不會(huì)以CMT的方式回滾,如果把rollback屬性設(shè)置為true,則會(huì)通知容器失敗時(shí)進(jìn)行事務(wù)回滾,并且是在把應(yīng)用異常傳遞給調(diào)用者或客戶端之前進(jìn)行的。

    如果有未預(yù)料的unchecked exception,比如ArrayOutOfBoundsExceptionNullPointerException,容器仍然會(huì)回滾CMT事務(wù),但是在這種情況下,容器會(huì)認(rèn)為bean處在了一種inconsistent的情況下,會(huì)進(jìn)而銷毀bean實(shí)例,這是十分消耗資源的,所以you should never delibrately use system exceptions.

     

    CMT使開發(fā)人員不必關(guān)心EJB事務(wù)中的大部分細(xì)節(jié),當(dāng)然同時(shí)CMT能提供對(duì)事務(wù)的控制級(jí)別也更少,這一點(diǎn)Bean管理的事務(wù)(BMT)更適合。

     

    posted @ 2009-06-06 21:11 J@mes 閱讀(922) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲乱码一二三四区国产| 亚洲欧美成aⅴ人在线观看| 99re这里有免费视频精品| 亚洲欧洲日产专区| 国产资源免费观看| a毛片在线看片免费| 亚洲成在人线中文字幕| 日韩在线免费播放| 国产偷伦视频免费观看| 亚洲一线产品二线产品| 亚洲日韩国产一区二区三区| 久久福利资源网站免费看| 国产精品亚洲精品日韩动图| 亚洲日本中文字幕| 亚洲高清免费视频| 97碰公开在线观看免费视频| 免费观看四虎精品成人| 亚洲中文字幕无码av在线| 国产亚洲色视频在线| 国产在线观看片a免费观看| 国产真人无码作爱免费视频| 亚洲综合av一区二区三区不卡| 亚洲中文字幕无码永久在线| 成人毛片手机版免费看| 免费A级毛片无码专区| 九九九精品视频免费| 亚洲欧洲av综合色无码| 色拍自拍亚洲综合图区| 国产L精品国产亚洲区久久| 成年男女男精品免费视频网站| 免费无码一区二区三区蜜桃| 特级aa**毛片免费观看| 中文有码亚洲制服av片| 亚洲AV本道一区二区三区四区| 亚洲成人国产精品| 午夜私人影院免费体验区| 免费观看国产网址你懂的| 久久香蕉国产线看免费| EEUSS影院WWW在线观看免费| 亚洲av无码专区国产不乱码| 亚洲中字慕日产2020|