• 雷林鹏分享:EJB事务管理


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

      原子 -如果有任何的工作项失败,完整的单元被认为是失败。成功意味着所有项目的成功执行。

      一致性 -事务必须保持系统处于一致的状态。

      独立性- 每个事务执行独立的任何其他的事务。

      持久性 - 事务应该生存系统故障,如果已经执行或提交。

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

      Container Managed Transactions - 在这种类型中,容器管理的事务状态。

      Bean Managed Transactions - 在这种类型中,开发者管理事务状态的生命周期。

      容器管理的事务

      指定EJB3.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()业务方法时,需要使用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管理的事务,事务处理应用水平的异常,可以管理。以下是要考虑的关键点

      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()方法调用。(编辑:雷林鹏 来源:网络|侵删)

  • 相关阅读:
    20155305乔磊2016-2017-2《Java程序设计》第三周学习总结
    20155305乔磊2016-2017-2《Java程序设计》第二周学习总结
    20155305乔磊2016-2017-2《Java程序设计》第一周学习总结
    20155305乔磊第三次随笔
    乔磊20155305第二次随笔
    乔磊的第一次随笔
    20155302 2016-2017-2 《Java程序设计》第九周学习总结
    20155302 2016-2017-2 《Java程序设计》第八周学习总结
    20155302 2016-2017-2 《Java程序设计》第七周学习总结
    20155302 2016-2017-2 《Java程序设计》第六周学习总结
  • 原文地址:https://www.cnblogs.com/pengpeng1208/p/13099344.html
Copyright © 2020-2023  润新知