EJB事务

2018-12-09 10:35 更新

事务是工作项目的单个单元下面的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()方法调用


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号