EJB - İşlemler

İşlem, ACID özelliklerini izleyen tek bir iş öğeleri birimidir. ACID, Atomik, Tutarlı, İzole ve Dayanıklı anlamına gelir.

  • Atomic- İş öğelerinin herhangi biri başarısız olursa, tüm birim başarısız kabul edilecektir. Başarı, tüm öğelerin başarıyla yürütüldüğü anlamına geliyordu.

  • Consistent - Bir işlem, sistemi tutarlı durumda tutmalıdır.

  • Isolated - Her işlem diğer işlemlerden bağımsız olarak yürütülür.

  • Durable - İşlem, gerçekleştirilmiş veya gerçekleştirilmişse, sistem arızasından kurtulmalıdır.

EJB Container / Servers, işlem sunucularıdır ve işlem içeriği yayılımını ve dağıtılmış işlemleri yönetir. İşlemler, konteyner tarafından veya fasulye kodundaki özel kod işleme ile yönetilebilir.

  • Container Managed Transactions - Bu türde konteyner, işlem durumlarını yönetir.

  • Bean Managed Transactions - Bu türde geliştirici, işlem durumlarının yaşam döngüsünü yönetir.

Konteyner Tarafından Yönetilen İşlemler

EJB 3.0, EJB konteynerlerinin uyguladığı aşağıdaki işlem özniteliklerini belirtmiştir:

  • REQUIRED - İşlem içinde iş yönteminin yürütülmesi gerektiğini, aksi takdirde bu yöntem için yeni bir işlem başlatılacağını belirtir.

  • REQUIRES_NEW - İş yöntemi için yeni bir işlemin başlatılacağını gösterir.

  • SUPPORTS - İş yönteminin işlemin bir parçası olarak yürütüleceğini gösterir.

  • NOT_SUPPORTED - İş yönteminin işlemin bir parçası olarak yürütülmemesi gerektiğini belirtir.

  • MANDATORY - İş yönteminin işlemin bir parçası olarak uygulanacağını, aksi takdirde istisna atılacağını belirtir.

  • NEVER - İş yönteminin işlemin bir parçası olarak yürütüldüğünü, ardından bir istisna atılacağını gösterir.

Misal

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 () iş yöntemi, Gerekli ek açıklama kullanılarak Gerekli hale getirilir.

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 () iş yöntemi, createUserDetail () kullanıyor. CreateUser () çağrısı sırasında istisna meydana gelirse ve User nesnesi oluşturulmazsa, UserDetail nesnesi de oluşturulmaz.

Bean Tarafından Yönetilen İşlemler

Bean Tarafından Yönetilen İşlemlerde İşlemler, uygulama düzeyinde istisnalar ele alınarak yönetilebilir.

Dikkate alınması gereken temel noktalar şunlardır:

  • Start - Bir işletme yönteminde işlem ne zaman başlatılmalı.

  • Sucess - Bir işlemin gerçekleştirilmesi gereken başarı senaryosunu belirleyin.

  • Failed - Bir işlemin geri alınacağı zamanki hata senaryosunu belirleyin.

Misal

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

Bu örnekte, kullandık UserTransaction kullanarak işlemin başlangıcını işaretlemek için arayüz userTransaction.begin()yöntem çağrısı. İşlemin tamamlandığını kullanarak işaretlerizuserTransaction.commit() yöntemi ve işlem sırasında herhangi bir istisna meydana gelirse, işlemi kullanarak tüm işlemi geri alırız. userTransaction.rollback() yöntem çağrısı.