目录

EJB - 事务( Transactions)

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

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

  • Consistent - 事务必须使系统保持一致状态。

  • Isolated - 每个事务独立于任何其他事务执行。

  • Durable - 如果已执行或已执行,则事务应在系统故障后继续存在。

EJB容器/服务器是事务服务器,处理事务上下文传播和分布式事务。 事务可以由容器管理,也可以通过bean代码中的自定义代码处理来管理。

  • Container Managed Transactions - 在此类型中,容器管理事务状态。

  • Bean Managed Transactions - 在此类型中,开发人员管理事务状态的生命周期。

容器管理事务

EJB 3.0指定了以下EJB事件容器实现的事务属性 -

  • REQUIRED - 表示必须在事务中执行业务方法,否则将为该方法启动新事务。

  • REQUIRES_NEW - 表示要为业务方法启动新事务。

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

  • NOT_SUPPORTED - 表示不应将业务方法作为事务的一部分执行。

  • MANDATORY - 表示业务方法将作为事务的一部分执行,否则将抛出异常。

  • NEVER - 指示业务方法是否作为事务的一部分执行,然后将引发异常。

例子 (Example)

package com.iowiki.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
   }
}

使用Required注释创建createUserDetail()业务方法。

package com.iowiki.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()调用期间发生异常并且未创建User对象,则也不会创建UserDetail对象。

Bean管理事务

在Bean管理事务中,可以通过在应用程序级别处理异常来管理事务。

以下是要考虑的关键点 -

  • Start - 何时在业务方法中启动事务。

  • 成功 - 确定要提交事务时的成功方案。

  • Failed - 确定要回滚事务时的失败方案。

例子 (Example)

package com.iowiki.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()方法调用回滚整个事务。

↑回到顶部↑
WIKI教程 @2018