Ejb-transactions

提供:Dev Guides
移動先:案内検索

EJB-トランザクション

トランザクションは、ACIDプロパティに従う作業アイテムの単一ユニットです。 ACIDは、Atomic、Consistent、Isolated、Durableの略です。

  • アトミック-ワークアイテムのいずれかが失敗した場合、ユニット全体が失敗したと見なされます。 成功とは、すべてのアイテムが正常に実行されることを意味します。
  • 一貫性-トランザクションは、システムを一貫した状態に保つ必要があります。
  • 分離-各トランザクションは、他のトランザクションとは無関係に実行されます。
  • 耐久性-トランザクションは、実行またはコミットされた場合、システム障害に耐える必要があります。

EJBコンテナ/サーバーはトランザクションサーバーであり、トランザクションコンテキストの伝播と分散トランザクションを処理します。 トランザクションは、コンテナまたはBeanのコードのカスタムコード処理によって管理できます。

  • Container Managed Transactions -このタイプでは、コンテナーがトランザクションの状態を管理します。
  • * Bean Managed Transactions-このタイプでは、開発者はトランザクション状態のライフサイクルを管理します。

コンテナ管理トランザクション

EJB 3.0は、EJBコンテナが実装するトランザクションの次の属性を指定しました-

  • 必須-ビジネスメソッドをトランザクション内で実行する必要があることを示します。そうしないと、そのメソッドに対して新しいトランザクションが開始されます。
  • REQUIRES_NEW -新しいトランザクションがビジネスメソッドに対して開始されることを示します。
  • SUPPORTS -ビジネスメソッドがトランザクションの一部として実行されることを示します。
  • NOT_SUPPORTED -ビジネスメソッドをトランザクションの一部として実行しないことを示します。
  • 必須-ビジネスメソッドがトランザクションの一部として実行されることを示し、そうでない場合は例外がスローされます。
  • NEVER -ビジネスメソッドがトランザクションの一部として実行される場合、例外がスローされます。

package com.finddevguides.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アノテーションを使用してRequiredになります。

package com.finddevguides.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()呼び出し中に例外が発生し、Userオブジェクトが作成されない場合、UserDetailオブジェクトも作成されません。

Bean管理トランザクション

Bean Managed Transactionsでは、アプリケーションレベルで例外を処理することでトランザクションを管理できます。

考慮すべき重要な点は次のとおりです-

  • 開始-ビジネスメソッドでいつトランザクションを開始するか。
  • 成功-トランザクションをコミットするときの成功シナリオを特定します。
  • Failed -トランザクションをロールバックする場合の障害シナリオを特定します。

package com.finddevguides.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()*メソッド呼び出しを使用してトランザクション全体をロールバックします。