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