EJB 3 事务管理探讨 收藏

EJB事务的特点: 提供声明式事务与编程式事务 声明式事务:应用程序只需要关心业务逻辑,由容器来负责事务的管理。这是实践中常用的方法。 编程时事务:应用程序编码人员自己写事务代码。 ② EJB事务编程的类型 A、CMT 容器管理事务 B、BMT Bean管理事务 C、Client-MT Client-Controlled Transaction客户端管理事务 实体Bean只能用CMT。 CMT: 由容器实现的远程对象/拦截器,负责调用中间件服务。 优点:在应用程序代码中,不用编写事务服务代码; 缺点:粗粒度,只能在方法级别控制事务。 EJB Bean类中编程方式来使用事务(BMT): 优点:细粒度地控制事务 缺点:事务代理与业务代码纠缠 Client-controlled Transaction: 优点:客户端可以精确控制事务 缺点:可能会因为网络问题引起是事务的回滚。 3、EJB事务边界的划分 事务边界:事务边界是指事务从哪里开始。 CMT的事务特性: Required:Bean类的方法必须要在事务环境下运行,这是容器默认的事务机制。 事务特性只能使用在CMT。 RequiredNew:Bean类中的方法必须在一个新的事务环境下运行。 Supports:Bean类的方法不需要支持事务。如果客户端有事务,则继续沿用原事务环境。 Mandatory:Bean类中方法必须要在事务环境下运行。客户端不启动事务则报错。 NoSupported:Bean类中方法不支持事务。如果客户端启动了事务,则挂起该事务。 Never:Bean类中的方法不支持事务。如果客户端启动了事务,则报错。 如果没有指定参数,@TransactionAttribute 注释使用REQUIRED 作为默认参数。 三、EJB事务的编程 1、CMT @TransationManagement 用在类前,标注该EJB事务管理方式为Bean | Container(默认) @TrasactionAttribute 用在方法前,标注事务特性(事务的边界) @SessionContext.setRollbackOnly() 回滚标识,setRollbackOnly()方法必须在事务环境下运行。 EJB容器对于非受查异常(主要指RuntimeException)会回滚,事务对于受查异常则会提交事务。 2、BMT UserTransaction: ① interface ② 提供控制事务的方法 ③ 由容器实现,可以使用@Resource注入 UserTransaction.begin()| commit()| .rollback() 3、客户端控制事务 调用EJB的方法,要求EJB必须采用CMT形式。 4、事务的隔离性 事务的隔离级别: A、Read uncommitted:性能最高 B、Read committed:解决脏读问题 C、Repeatable read:解决重复读取问题 D、Serializable:解决幻读问题 EJB本身不提供隔离级别的设置,可以通过直接设置数据库(连接池)的隔离级别。 由于CMT依靠容器开始、提交和回滚事务,所以会限制事务的边界位置。而BMT则允许通过编程的方式来指定事务的开始、提交和回滚的位置。主要使用的是javax.transaction.UserTransaction接口。 例如: 如果使用有状态的Session Bean且需要跨越方法调用维护事务,那么BMT是你唯一的选择,当然BMT这种技术复杂,容易出错,且不能连接已有的事务,当调用BMT方法时,总会暂停已有事务,极大的限制了组件的重用。故优先考虑CMT事务管理。 @Stateless) @TransactionManagement(TransactionManagementType.BEAN) public class ManagerBean { @Resource private UserTransaction userTransaction; public void placeSnagItOrder(Item item, Customer customer){ try { userTransaction.begin(); validateCredit(customer); .... userTransaction.commit(); } catch (CreditValidationException cve) { userTransaction.rollback(); } catch (CreditProcessingException cpe){ userTransaction.rollback(); } ..... } } @TransactionManagement(TransactionManagementType.BEAN) 指定了事务的类型为BMT,上面没有用到@TransactionAttribute,因为它只适用于CMT,在上面代码中,可以显示的指定事务的开始与提交,因此更加的灵活。上面最关键的地方是注入了UserTransaction资源。其中获得UserTransaction资源的方式有三种,除了用EJB资源的方式注入以外,还有以下两种方式: (1) JNDI查找 Context context = new InitialContext(); UserTransaction userTransaction = (UserTransaction) context.lookup(“java:comp/UserTransaction”); userTransaction.begin(); userTransaction.commit(); 如果在EJB之外,则可使用此方法,如在不支持依赖注入的JBoss4.2.2的Web工程或helper class即帮助器类中都可以。 (2)EJBContext @Resource private SessionContext context; ... UserTransaction userTransaction = context.getUserTransaction(); userTransaction.begin(); userTransaction.commit(); getUserTransaction方法只能在BMT中使用。如果在CMT中使用,则会抛出IllegalStateException异常。且在BMT中不能使用EJBContext的getRollbackOnly和setRollbackOnly方法,如果这样使用,也会抛出IllegalStateException异常。 @TransactionAttribute(TransactionAttributeType.REQUIRED) public void insertProduct(String name, Float price, boolean error) { } 其中,@TransactionAttribute(TransactionAttributeType.REQUIRED)表示指定事务的类型。 如果省略,默认为CMT方式。 @TransactionAttribute(TransactionAttributeType.REQUIRED)通知容器如何管理事务, 事务的属性控制了事务的使用范围,因为事务之间的关系非常的复杂,这个属性主要是用来处理事务与事务之间怎样来处理的的问题。 如果产生一个系统异常,容器将自动回滚该事务。 EJBException是RuntimeException的子类,即也是一个系统运行时异常。 如果Bean抛出一个普通的非继承自RutimeException应用异常,事务将不会自动回滚,但可以 通过调用EJBContext的SetRollbackOnly回滚。 EJB上下文还有一个getRollbackOnly方法,通过返回一个boolean值来确定CMT事务是否已被标记为回滚。如果开始非常耗资源的操作前判断此bean的事务已被标记为回滚,则可以节约很多系统资源。 对于上面的异常回滚操作,还有一更加优雅的方式: @ApplicationException(rollback=true) public class CreditValidationException extends Exception { @ApplicationException(rollback=true) public class CreditProcessingException extends Exception { //系统异常 @ApplicationException(rollback=false) public class DatabaseException extends RuntimeException { @ApplicationExcepti把JAVA核对与不核对的异常标识为应用程序异常。其rollback默认为false,表示程序不会导致CMT自动回滚 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tfnew21/archive/2009/12/30/5106864.aspx
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值