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.