(上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事务管理器。
具体情况具体操作...