EJB事务 - EJB

事务是一个单元的工作项目遵循ACID特性。ACID代表原子性,一致性,独立性和持久性。

EJB容器/服务器,的事务服务器和处理事务上下文的传递和分布式事务。事务可以由容器管理或bean的代码自定义代码处理。

容器管理的事务

指定EJB3.0,EJB容器实现的事务特性。

例子

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()业务方法时,需要使用Required注解。

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管理的事务,事务处理应用水平的异常,可以管理。以下是要考虑的关键点

实例

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()方法调用。