2010-12-03 3 views
0

Скажем, у меня есть два 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 
    } 
} 
  • Аа() не подключается к базе данных, но вызывает Bb()
  • Bb() делает ВЫБРАТЬ в базу данных
  • Aa() имеет атрибут транзакции по умолчанию, который в этом контейнере НЕОБХОДИМО

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

Baseline является то, что я не хочу, чтобы это было работать в транзакции, так что я мог бы использовать NotSupported для Аа(), я предполагаю (?), но я пытаюсь понять, как и с участием или нет использование базы данных в разных точках стека вызовов влияет на транзакции.

+0

Какие рамки вы используете для включения транзакций? Весна? – 2010-12-03 14:21:00

+0

Просто EJB3 с Weblogic. Но если он ведет себя по-разному в разных рамках, я хотел бы узнать об этом тоже :) – fish 2010-12-03 14:29:06

ответ

3

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

В вашем случае A не имеет TransactionAttribute и работает как НЕОБХОДИМЫЙ. Это откроет новую транзакцию в начале с A.a(). Вызов B.b() выполняется внутри транзакции от A. Но транзакция базы данных не выполняется после завершения B.b(). Сначала A.a() должен закончить. Если в A.a() есть исключение из-за вызова B.b(), B.b() будет откат.

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

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