事务是单个工作项单元,它遵循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()方法调用回滚整个事务