EJB - Транзакции
Транзакция - это единая единица рабочих элементов, которая соответствует свойствам ACID. ACID означает атомарный, согласованный, изолированный и надежный.
Atomic- Если какой-либо из рабочих элементов выйдет из строя, весь блок будет считаться неисправным. Успех означает, что все элементы выполняются успешно.
Consistent - Транзакция должна поддерживать систему в согласованном состоянии.
Isolated - Каждая транзакция выполняется независимо от любой другой транзакции.
Durable - Транзакция должна пережить сбой системы, если она была выполнена или зафиксирована.
Контейнер / серверы EJB являются серверами транзакций и обрабатывают распространение контекста транзакций и распределенные транзакции. Транзакциями можно управлять с помощью контейнера или пользовательской обработки кода в коде компонента.
Container Managed Transactions - В этом типе контейнер управляет состояниями транзакции.
Bean Managed Transactions - В этом типе разработчик управляет жизненным циклом состояний транзакции.
Транзакции, управляемые контейнером
EJB 3.0 определяет следующие атрибуты транзакций, которые реализуют контейнеры EJB:
REQUIRED - Указывает, что бизнес-метод должен выполняться внутри транзакции, в противном случае для этого метода будет запущена новая транзакция.
REQUIRES_NEW - Указывает, что для бизнес-метода должна быть начата новая транзакция.
SUPPORTS - Указывает, что бизнес-метод будет выполняться как часть транзакции.
NOT_SUPPORTED - Указывает, что бизнес-метод не должен выполняться как часть транзакции.
MANDATORY - Указывает, что бизнес-метод будет выполняться как часть транзакции, в противном случае будет создано исключение.
NEVER - Указывает, выполняется ли бизнес-метод как часть транзакции, тогда будет создано исключение.
пример
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
}
}
Бизнес-метод createUserDetail () сделан Обязательным с использованием Обязательной аннотации.
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();
}
}
Бизнес-метод createUser () использует createUserDetail (). Если во время вызова createUser () произошло исключение и объект User не был создан, объект UserDetail также не будет создан.
Транзакции, управляемые компонентом
В транзакциях, управляемых компонентами, транзакциями можно управлять путем обработки исключений на уровне приложения.
Ниже приведены ключевые моменты, которые следует учитывать:
Start - Когда начинать транзакцию в бизнес-методе.
Sucess - Определите сценарий успеха, когда транзакция должна быть зафиксирована.
Failed - Выявление сценария сбоя при откате транзакции.
пример
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{
}
}
В этом примере мы использовали UserTransaction интерфейс для отметки начала транзакции с помощью userTransaction.begin()вызов метода. Мы отмечаем завершение транзакции, используяuserTransaction.commit() метод, и если во время транзакции возникло какое-либо исключение, мы откатываем всю транзакцию, используя userTransaction.rollback() вызов метода.