EJB事务
事务是工作项目的单个单元下面的ACID属性。 ACID代表原子性,一致性,独立性和持久性。
Atomic-如果有任何工作项目的失败,整个单元被认为失败。成功意味着所有项目成功执行。
Consistent-事务必须使系统保持一致的状态。
Isolated-每个事务执行独立于任何其他交易。
Durable-如果已经执行或承诺交易应该生存系统故障。
EJB容器/服务器是事务服务器和处理事务上下文传播和分布式事务。事务可以由容器或者通过自定义代码在bean的代码中处理进行管理。
Container Managed Transactions 容器管理事务 -在这种类型中,容器管理事务的状态。
Bean Managed Transactions Bean管理事务-在这种类型,开发管理事务状态的生命周期。
容器管理事务
EJB 3.0 的 EJB 容器实现已指定以下属性的事务记录。
REQUIRED -表明业务方法已被交易,否则一个新的事务将开始该方法中执行。
REQUIRES_NEW -表明启动一个新事务的业务方法。
SUPPORTS -指示业务方法将作为事务的一部分执行。
NOT_SUPPORTED -表明业务方法不应该执行作为事务的一部分。
MANDATORY-表示业务方法将执行作为交易的一部分,否则将引发异常。
NEVER -明如果业务方法执行作为事务的一部分,那么就会抛出一个异常。
示例
package com.tutorialspoint.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.tutorialspoint.txn.required; import javax.ejb.* @Stateless public class UserSessionBean implements UserRemote { private User; @EJB private UserDetailRemote userDetail; public void createUser() { //create user //... //create user details userDetail.createUserDetail(); } }
createUser() 业务方法使用 createUserDetail()。如果在 createUser() 调用期间发生异常,并且不创建用户对象然后 UserDetail将也不创建对象
Bean管理事务
在Bean管理事务,事务可以通过在应用程序级异常处理进行管理。下面是要考虑的关键点
Start 开始 -当在业务方法启动事务。
Sucess 成功 -确定成功场景当事务被提交。
Failed 失败 -未能确定方案时,一个事务将被回滚。
示例
package com.tutorialspoint.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()方法调用