EJB事務

2018-12-09 10:35 更新

事務是工作項目的單個單元下面的ACID屬性。 ACID代表原子性,一致性,獨立性和持久性。

  • Atomic-如果有任何工作項目的失敗,整個單元被認為失敗。成功意味著所有項目成功執(zhí)行。

  • Consistent-事務必須使系統(tǒng)保持一致的狀態(tài)。

  • Isolated-每個事務執(zhí)行獨立于任何其他交易。

  • Durable-如果已經執(zhí)行或承諾交易應該生存系統(tǒng)故障。

EJB容器/服務器是事務服務器和處理事務上下文傳播和分布式事務。事務可以由容器或者通過自定義代碼在bean的代碼中處理進行管理。

  • Container Managed Transactions  容器管理事務 -在這種類型中,容器管理事務的狀態(tài)。

  • Bean Managed Transactions  Bean管理事務-在這種類型,開發(fā)管理事務狀態(tài)的生命周期。


容器管理事務

EJB 3.0  EJB 容器實現(xiàn)指定以下屬性的事務記錄。

  • REQUIRED -表明業(yè)務方法已被交易,否則一個新的事務將開始該方法中執(zhí)行。

  • REQUIRES_NEW -表明啟動一個新事務的業(yè)務方法。

  • SUPPORTS -指示業(yè)務方法作為事務一部分執(zhí)行

  • NOT_SUPPORTED -表明業(yè)務方法不應該執(zhí)行作為事務的一部分。

  • MANDATORY-表示業(yè)務方法將執(zhí)行作為交易的一部分,否則將引發(fā)異常。

  • NEVER -明如果業(yè)務方法執(zhí)行作為事務的一部分,那么就會拋出一個異常。


示例

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()業(yè)務方法需要使用需要注釋

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() 業(yè)務方法使用 createUserDetail()。如果在 createUser() 調用期間發(fā)生異常并且創(chuàng)建用戶對象然后 UserDetail創(chuàng)建對象


Bean管理事務

在Bean管理事務,事務可以通過在應用程序級異常處理進行管理。下面是要考慮的關鍵點

  • Start 開始 -當在業(yè)務方法啟動事務。

  • 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()方法,如果交易中發(fā)生的任何異常情況然后我們回滾整個事務使用userTransaction.rollback()方法調用


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號