Граница транзакции EJB 3.0, вызывающая один локальный EJB из другого - PullRequest
3 голосов
/ 31 августа 2010

Представьте себе два следующих сессионных компонента ejb3.0 без состояния, каждый из которых реализует локальный интерфейс, и они развернуты в одном и том же контейнере:

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, каждый вызов метода methodB вызывает новыйтранзакция, чтобы начать и совершить?Или, поскольку это оба локальных bean-компонента, существует ли одна транзакция, которая начинается при вызове метода A и повторно используется методом B?

Cheers!

Ответы [ 2 ]

2 голосов
/ 31 августа 2010

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

  • REQUIRED
  • REQUIRES_NEW
  • SUPPORTS
  • ОБЯЗАТЕЛЬНО
  • NOT_SUPPORTED
  • НИКОГДА

НЕОБХОДИМО по умолчанию и начнет новую транзакцию, если транзакция отсутствует, в противном случае контейнер используетсуществующая транзакция.

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();
        }
    }    
}

... сделает метод A () всегда запущенным в новой транзакции.

1 голос
/ 31 августа 2010

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

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

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

...