Это работает в транзакции? - PullRequest
       27

Это работает в транзакции?

0 голосов
/ 03 декабря 2010

Допустим, у меня есть два EJBs A и B:

public class A implements AInterface {

    private B b;
    ...
    //This method will NOT access database directly
    public void a() {
        //do something
        b.b();
        //do something
    }
    ...
}

public class B implements BInterface {

    @TransactionAttribute(TransactionAttributeType.SUPPORTS)
    public void b() {
        //Read database
    }
}
  • A.a () не подключается к базе данных, но вызывает B.b ()
  • B.b () делает SELECT для базы данных
  • A.a () имеет атрибут транзакции по умолчанию, который в этом контейнере ОБЯЗАТЕЛЬНО

Будет ли вызов A.a () выполняться в транзакции? Инициируется ли транзакция при вводе A.a (), при вводе B.b (), при обращении к базе данных или в другое время?

Исходная ситуация: я не хочу, чтобы это выполнялось в транзакции, поэтому я могу использовать NOTSUPPORTED для Aa (), я думаю (? ), но я пытаюсь понять, как Вовлечение или не привлечение базы данных в разные точки стека вызовов влияет на транзакции.

1 Ответ

3 голосов
/ 03 декабря 2010

Транзакция не зависит от самого соединения с базой данных. В EJB транзакция - это не просто транзакция базы данных. Транзакция может включать несколько ресурсов (см. XA транзакции ) и несколько вызовов методов. Только если все они успешны, транзакция будет успешной.

В вашем случае A не имеет атрибута TransactionAttribute и работает как REQUIRED. Это откроет новую транзакцию прямо в начале из A.a (). Вызов B.b () выполняется внутри транзакции из A. Но транзакция базы данных не фиксируется после завершения B.b (). Сначала A.a () должна закончить. Если, например, в A.a () есть исключение после вызова B.b (), B.b () будет откатан.

Если вы хотите, чтобы B.b () фиксировал в любом случае, я бы предложил использовать RequNew вместо NotSupported.

Описание всех атрибутов транзакций вы найдете в Java EE Tutorial .

...