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() вызов метода.