(上1篇文章中我們介紹了《會(huì)話EJB系列(3)SessionBean生命周期》,本為的主要介紹SessionBean中事務(wù)管理)
SessionBean從功能上可以分為兩類:
第1類:成為EAO:用于封裝底層的實(shí)體和JPA,本質(zhì)上其功能就是DAO。(不需要事務(wù)控制。由于JPA本質(zhì)是對(duì)ORM實(shí)現(xiàn)的封裝。)
第2類:充當(dāng)業(yè)務(wù)組件:是底層EAO對(duì)象的Facade,系統(tǒng)控制器(如struts中的Action,springMVC中的Controller)將調(diào)用他們的業(yè)務(wù)方法來處理用戶要求。(需要添加事務(wù)控制。由于它代表了1次完全的業(yè)務(wù)邏輯)
EJB的事務(wù)管理機(jī)制依然是建立在JTA事務(wù)基礎(chǔ)之上,因此利用服務(wù)器會(huì)負(fù)責(zé)處理事務(wù)管理的底層細(xì)節(jié)。
EJB3中仍提供容器管理事務(wù)(CMT)和Bean管理事務(wù)(BMT)兩種,并允許采取Annotation機(jī)制來指定事務(wù)屬性,替換了EJB2中的XML配置文件方式。
對(duì)CMT:容器負(fù)責(zé)決定事務(wù)的邊界:方法開始就是事務(wù)開始,方法結(jié)束就是事務(wù)結(jié)束。
對(duì)BMT:事務(wù)邊界由開發(fā)人員靈活決定(事務(wù)開始、事務(wù)回滾、事務(wù)結(jié)束)
1.容器管理事務(wù)
CMT:容器負(fù)責(zé)決定事務(wù)的邊界:方法開始就是事務(wù)開始,方法結(jié)束就是事務(wù)結(jié)束。
(1)Annotation控制事務(wù)方式
SessionBean的事務(wù)管理機(jī)制與MDB的事務(wù)管理方式完全1樣,都是通過在Bean上使用@TransactionManagement、 @TransactionAttribute兩個(gè)Annotation來控制的。無需對(duì)該接口代碼進(jìn)行任何改變。
1) @TransactionManagement,value屬性設(shè)置事務(wù)處理方式:CMT?還是BMT?,如:
TransactionManagementType.BEAN:指定使用BMT管理事務(wù)
TransactionManagementType.CONTAINER:指定使用CMT管理事務(wù)
2)@TransactionAttribute,既可以用于修飾SessionBean或MDB 的Bean實(shí)現(xiàn)類,也用于修飾某個(gè)業(yè)務(wù)方法(優(yōu)先),
并通過value值,設(shè)置事務(wù)屬性為枚舉類型之1:
(2)捕獲‘自定義異常’
默許,產(chǎn)生系統(tǒng)異常,CMT會(huì)控制事務(wù)回滾;若為自定義異常,不會(huì)回滾。
但可以,手工控制‘自定義異常’回滾,方式以下:
第1種:使用EJBContext的setRollbackOnly(),顯示控制代碼回滾
第2種:使用@ApplicationException Annotation,指定rollback屬性為true便可
(3)注意
CMT意味著容器管理EJB業(yè)務(wù)方法中的事務(wù),因此開發(fā)者不應(yīng)當(dāng)在開發(fā)時(shí),調(diào)用任何開始、結(jié)束事務(wù)的方法
2.Bean管理
對(duì)BMT:事務(wù)邊界由開發(fā)人員靈活決定(事務(wù)開始、事務(wù)回滾、事務(wù)結(jié)束),主要通過UserTransaction來控制事務(wù)。本質(zhì),就是通過編程操作JTA事務(wù)管理器。
(1)EJB的Bean類中獲得UserTransaction對(duì)象的,3種方式:
第1種:使用@Resource Annotation履行依賴注入
第2種:通過JNDI查找獲得,如:UserTransaction ut=(UserTransaction)ctx.lookup("UserTransaction");
第3種:使用EJBContext的getUserTransaction()方法獲得,如:UserTransaction ut=ctx.getUserTransaction();
(2)UserTransaction 中所含方法簡(jiǎn)單解析 (略)
3.對(duì)照CMT和BMT
(1)特點(diǎn)
CMT(默許):容器負(fù)責(zé)決定事務(wù)的邊界:方法開始就是事務(wù)開始,方法結(jié)束就是事務(wù)結(jié)束。
BMT:事務(wù)邊界由開發(fā)人員靈活決定(事務(wù)開始、事務(wù)回滾、事務(wù)結(jié)束) 。本質(zhì),通過編程操作JTA事務(wù)管理器。
通常,EJB容器建議使用CMT事務(wù)管理。
(2)優(yōu)缺點(diǎn)
BMT優(yōu)點(diǎn):更靈活!開發(fā)者自行決定事務(wù)邊界
BMT缺點(diǎn):
1.由于開發(fā)者采取硬編碼方式來實(shí)現(xiàn)事務(wù)管理,不可避免的致使業(yè)務(wù)邏輯和是無邏輯混淆的缺點(diǎn),切難于切換其它管理方式。
2. 客戶端調(diào)用BMT方法時(shí),會(huì)暫停當(dāng)前已有事務(wù),就制約了組件的復(fù)用
(3)BMT有兩種必須存在的場(chǎng)景,和對(duì)應(yīng)的爭(zhēng)議:
1)開發(fā)者需要為業(yè)務(wù)方法中某段代碼添加事務(wù)。(為什么不將這段代碼抽離?封裝成1個(gè)方法?)
2)有狀態(tài)SessionBean需要跨方法調(diào)用保護(hù)事務(wù),也就是需要將多個(gè)方法放在1個(gè)事務(wù)中進(jìn)行保護(hù)。(顯示多個(gè)方法組成了1個(gè)完全的業(yè)務(wù)邏輯,為什么不將它們整體封裝成1個(gè)業(yè)務(wù)方法)
4.總結(jié)
SessionBean中事務(wù)管理,分為兩種:容器管理事務(wù)(CMT)和Bean管理事務(wù)(BMT)
CMT(默許):容器負(fù)責(zé)決定事務(wù)的邊界:方法開始就是事務(wù)開始,方法結(jié)束就是事務(wù)結(jié)束。BMT:事務(wù)邊界由開發(fā)人員靈活決定(事務(wù)開始、事務(wù)回滾、事務(wù)結(jié)束) 。本質(zhì),通過編程操作JTA事務(wù)管理器。
具體情況具體操作...