开发手册 欢迎您!
软件开发者资料库

EJB - 事务

EJB事务 - 从简单和简单的步骤学习EJB 3.0和3.1(Enterprise Java Bean)框架,从基本概念到高级概念,包括概述,环境设置,应用服务器,容器,企业Bean,注释,会话,无状态会话,有状态会话,消息驱动,实体Bean,持久性,远程接口,查找,生命周期,接口,拦截器,可嵌入对象,Blob / Clobs,事务,安全性,JNDI绑定,实体关系,访问数据库,回调,定时服务,Web服务,部署描述符,创建应用程序,访问数据库,查询语言,依赖注入,异常处理,打包应用程序。

事务是单个工作项单元,它遵循ACID属性. ACID代表Atomic,Consistent,Isolated和Durable.

  • Atomic : 如果任何工作项失败,则整个单元将被视为失败.成功意味着,所有项目都成功执行.

  • 一致 : 交易必须使系统保持一致状态.

  • 隔离 : 每笔交易独立于任何其他交易执行.

  • 耐用 : 如果已经执行或提交,事务应该在系统失败后继续存在.

EJB容器/服务器是事务服务器并处理事务上下文传播和分发交易.事务可以由容器管理,也可以通过bean代码中的自定义代码处理.

  • 容器管理事务 : 在这种类型中,容器管理交易状态.

  • Bean管理交易 : 在这种类型中,开发人员管理交易状态的生命周期.

容器管理交易

EJB 3.0指定了以下事务属性,EJB容器实现和减去;

  • REQUIRED &减去;表示必须在事务中执行业务方法,否则将为该方法启动新事务.

  • REQUIRES_NEW : 表示要为业务方法启动新事务.

  • SUPPORTS : 表示业务方法将作为事务的一部分执行.

  • NOT_SUPPORTED : 表示不应将业务方法作为交易的一部分执行.

  • 强制 : 表示业务方法将作为事务的一部分执行,否则将抛出异常.

  • 从不 : 指示业务方法是否作为事务的一部分执行,然后将抛出异常.

示例

  package com.it1352.txn.required;  import javax.ejb.* @Stateless@TransactionManagement(TransactionManagementType.CONTAINER)public class UserDetailBean implements UserDetailRemote {   private UserDetail;   @TransactionAttribute(TransactionAttributeType.REQUIRED)   public void createUserDetail() {      //create user details object   } }

createUserDetail()使用必需的注释创建业务方法.

package com.it1352.txn.required; import javax.ejb.* @Statelesspublic class UserSessionBean implements UserRemote {   private User;   @EJB   private UserDetailRemote userDetail;   public void createUser() {      //create user       //...      //create user details      userDetail.createUserDetail();   }}

createUser()业务方法正在使用createUserDetail().如果在createUser()调用期间发生异常并且未创建User对象,则也不会创建UserDetail对象.

Bean管理事务

在Bean中托管交易,交易可以通过处理应用程序级别的异常来管理.

以下是要考虑的关键点 :

  • 开始 : 何时以商业方式开始交易.

  • 成功 : 确定要提交交易的成功方案.

  • 失败 : 确定事务要回滚时的故障情形.

示例

package com.it1352.txn.bmt;import javax.annotation.Resource;import javax.ejb.Stateless;import javax.ejb.TransactionManagement;import javax.ejb.TransactionManagementType;import javax.transaction.UserTransaction; @Stateless@TransactionManagement(value=TransactionManagementType.BEAN)public class AccountBean implements AccountBeanLocal {    @Resource   private UserTransaction userTransaction;   public void transferFund(Account fromAccount, double fund ,       Account toAccount) throws Exception{      try{         userTransaction.begin();         confirmAccountDetail(fromAccount);         withdrawAmount(fromAccount,fund);         confirmAccountDetail(toAccount);         depositAmount(toAccount,fund);         userTransaction.commit();      }catch (InvalidAccountException exception) {         userTransaction.rollback();      }catch (InsufficientFundException exception) {         userTransaction.rollback();      }catch (PaymentException exception) {         userTransaction.rollback();      }   }   private void confirmAccountDetail(Account account)       throws InvalidAccountException {   }   private void withdrawAmount() throws InsufficientFundException {   }   private void depositAmount() throws PaymentException{   } }

在此示例中,我们使用 UserTransaction 接口使用 userTransaction.begin()方法调用来标记事务的开始.我们使用 userTransaction.commit()方法标记事务的完成,如果在事务期间发生任何异常,那么我们使用 userTransaction.rollback()方法调用回滚整个事务