EJB事務(wù)

2018-12-09 10:35 更新

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

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

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

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

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

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

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

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


容器管理事務(wù)

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

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

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

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

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

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

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


示例

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

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


Bean管理事務(wù)

在Bean管理事務(wù),事務(wù)可以通過在應(yīng)用程序級異常處理進行管理。下面是要考慮的關(guān)鍵點

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

  • Sucess 成功 -確定成功場景當事務(wù)被提交。

  • Failed 失敗 -未能確定方案時,一個事務(wù)將被回滾。


示例

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接口標記事務(wù)的開始使用userTransaction.begin()方法調(diào)用。我們紀念完成事務(wù)通過userTransaction.commit()方法,如果交易中發(fā)生的任何異常情況然后我們回滾整個事務(wù)使用userTransaction.rollback()方法調(diào)用


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號