2010-08-31 2 views
3

Представьте следующие два ejb3.0 сеансные, каждый реализует локальный интерфейс, и они размещены в одном контейнере:EJB граница 3,0 транзакции вызова один локальный EJB из другого

public class EjbA { 
    @EJB 
    private ejbB; 

    public void methodA() { 
     for (int i=0; i<100; i++) { 
      ejbB.methodB(); 
     } 
    }  
} 

public class EjbB { 
    public void methodB() { 
     ... 
    } 
} 

Когда Methoda вызывается, каждый вызов методаB вызывает новую транзакцию для начала и фиксации? Или, поскольку у них есть оба локальных компонента, есть ли одна транзакция, которая начинается, когда методA вызывается и повторно используется методом B?

Cheers!

ответ

2

Это зависит от атрибута сделки - который вы можете установить с @TransactionAttribute аннотацию к одному из:

  • РЕГЛАМЕНТИРУЕТСЯ
  • REQUIRES_NEW
  • ОПОРЫ
  • ОБЯЗАТЕЛЬНОЕ
  • NOT_SUPPORTED
  • НИКОГДА

REQUIRED является значением по умолчанию и начнет новую транзакцию, если транзакция отсутствует, иначе контейнер использует существующую транзакцию.

REQUIRES_NEW указывает контейнеру, чтобы всегда начинать новую транзакцию.

Другие варианты менее часто используются в моем опыте - но все они определены в спецификации EJB.

Например:

@Stateless 
public class EjbA { 
    @EJB 
    private ejbB; 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void methodA() { 
     for (int i=0; i<100; i++) { 
      ejbB.methodB(); 
     } 
    }  
} 

... бы Methoda() всегда выполняется в новой транзакции.

1

зависит от того, как вы определяете стратегию транзакции для каждого метода.

если его Обязательный в методе B и A: он будет использовать ту же операцию для обоих

, если его требуется для A и требует нового для B: она будет создавать новую транзакцию для метода B

Смежные вопросы