EJB - Transactions

Une transaction est une unité unique d'éléments de travail, qui suit les propriétés ACID. ACID signifie atomique, cohérent, isolé et durable.

  • Atomic- Si l'un des éléments de travail échoue, l'unité entière sera considérée comme défaillante. Le succès signifiait que tous les éléments s'exécutaient avec succès.

  • Consistent - Une transaction doit maintenir le système dans un état cohérent.

  • Isolated - Chaque transaction s'exécute indépendamment de toute autre transaction.

  • Durable - La transaction doit survivre à une défaillance du système si elle a été exécutée ou validée.

Les conteneurs / serveurs EJB sont des serveurs de transactions et gèrent la propagation du contexte des transactions et les transactions distribuées. Les transactions peuvent être gérées par le conteneur ou par la gestion du code personnalisé dans le code du bean.

  • Container Managed Transactions - Dans ce type, le conteneur gère les états des transactions.

  • Bean Managed Transactions - Dans ce type, le développeur gère le cycle de vie des états de transaction.

Transactions gérées par conteneur

EJB 3.0 a spécifié les attributs suivants des transactions, que les conteneurs EJB implémentent -

  • REQUIRED - Indique que la méthode commerciale doit être exécutée dans la transaction, sinon une nouvelle transaction sera lancée pour cette méthode.

  • REQUIRES_NEW - Indique qu'une nouvelle transaction doit être lancée pour la méthode commerciale.

  • SUPPORTS - Indique que la méthode commerciale sera exécutée dans le cadre de la transaction.

  • NOT_SUPPORTED - Indique que la méthode commerciale ne doit pas être exécutée dans le cadre d'une transaction.

  • MANDATORY - Indique que la méthode métier s'exécutera dans le cadre de la transaction, sinon une exception sera levée.

  • NEVER - Indique si la méthode métier s'exécute dans le cadre de la transaction, une exception sera levée.

Exemple

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
   }
}

La méthode métier createUserDetail () est rendue obligatoire à l'aide de l'annotation obligatoire.

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();
   }
}

La méthode métier createUser () utilise createUserDetail (). Si une exception s'est produite lors de l'appel de createUser () et que l'objet Utilisateur n'est pas créé, l'objet UserDetail ne sera pas non plus créé.

Transactions gérées par Bean

Dans les transactions gérées par Bean, les transactions peuvent être gérées en gérant les exceptions au niveau de l'application.

Voici les points clés à considérer -

  • Start - Quand démarrer une transaction dans une méthode commerciale.

  • Sucess - Identifier le scénario de réussite lorsqu'une transaction doit être validée.

  • Failed - Identifiez le scénario d'échec lorsqu'une transaction doit être annulée.

Exemple

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{
   }
}

Dans cet exemple, nous avons utilisé UserTransaction interface pour marquer le début de la transaction en utilisant userTransaction.begin()appel de méthode. Nous marquons la fin de la transaction, en utilisantuserTransaction.commit() et si une exception s'est produite pendant la transaction, nous annulons la transaction complète en utilisant userTransaction.rollback() appel de méthode.