EJB - Transações

Uma transação é uma unidade única de itens de trabalho, que segue as propriedades ACID. ACID significa Atômico, Consistente, Isolado e Durável.

  • Atomic- Se algum item de trabalho falhar, toda a unidade será considerada com falha. Sucesso significa que todos os itens são executados com sucesso.

  • Consistent - Uma transação deve manter o sistema em estado consistente.

  • Isolated - Cada transação é executada independentemente de qualquer outra transação.

  • Durable - A transação deve sobreviver à falha do sistema se tiver sido executada ou confirmada.

Os contêineres / servidores EJB são servidores de transações e tratam da propagação do contexto de transações e transações distribuídas. As transações podem ser gerenciadas pelo contêiner ou por manipulação de código customizado no código do bean.

  • Container Managed Transactions - Nesse tipo, o contêiner gerencia os estados da transação.

  • Bean Managed Transactions - Nesse tipo, o desenvolvedor gerencia o ciclo de vida dos estados da transação.

Transações gerenciadas por contêiner

O EJB 3.0 especificou os seguintes atributos de transações, que os contêineres EJB implementam -

  • REQUIRED - Indica que o método de negócio deve ser executado dentro da transação, caso contrário, uma nova transação será iniciada para aquele método.

  • REQUIRES_NEW - Indica que uma nova transação deve ser iniciada para o método de negócio.

  • SUPPORTS - Indica que o método de negócios será executado como parte da transação.

  • NOT_SUPPORTED - Indica que o método de negócios não deve ser executado como parte da transação.

  • MANDATORY - Indica que o método de negócios será executado como parte da transação, caso contrário, uma exceção será lançada.

  • NEVER - Indica se o método de negócios é executado como parte da transação, então uma exceção será lançada.

Exemplo

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

O método de negócios createUserDetail () é tornado Obrigatório usando a anotação Obrigatória.

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

O método de negócios createUser () está usando createUserDetail (). Se ocorrer uma exceção durante a chamada de createUser () e o objeto User não for criado, o objeto UserDetail também não será criado.

Bean Managed Transactions

Em Bean Managed Transactions, as transações podem ser gerenciadas manipulando exceções no nível do aplicativo.

A seguir estão os pontos-chave a serem considerados -

  • Start - Quando iniciar uma transação em um método de negócios.

  • Sucess - Identifique o cenário de sucesso quando uma transação deve ser confirmada.

  • Failed - Identifique o cenário de falha quando uma transação deve ser revertida.

Exemplo

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

Neste exemplo, usamos UserTransaction interface para marcar o início da transação usando userTransaction.begin()chamada de método. Marcamos a conclusão da transação, usandouserTransaction.commit() método e se qualquer exceção ocorreu durante a transação, então, reverteremos a transação completa usando userTransaction.rollback() chamada de método.