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.