Режим транзакции EJB по умолчанию для асинхронных методов? - PullRequest
32 голосов
/ 25 октября 2010
  1. Когда у меня есть метод @Asynchronous в EJB, и я не указываю @TransactionAttribute, то как именно контейнер обрабатывает границы транзакции?Очевидно, он не может использовать транзакцию вызывающего потока, так что он делает?

  2. Тот же вопрос, но относительно методов, которые запускаются TimerService.


РЕДАКТИРОВАТЬ: Я думаю, что я сформулировал это плохо.Я уже знаю, что режим по умолчанию «ТРЕБУЕТСЯ».Поэтому следует с уверенностью предположить, что эти методы всегда будут вызываться в транзакции.Но мой вопрос: как выглядит жизненный цикл этой транзакции?Создает ли контейнер новую транзакцию для каждого вызова?Или он повторно использует одну и ту же транзакцию для всех вызовов в асинхронном рабочем потоке?Если это последнее, то когда транзакция закрывается?

Ответы [ 2 ]

45 голосов
/ 27 октября 2010

Как и в MDB, транзакция запускается контейнером непосредственно перед тем, как ваш метод @Asynchronous, @Schedule или @Timeout (и соответствующие перехватчики) фактически вызывается и фиксируется сразу после завершения метода (и перехватчиков).

Как обычно, транзакция распространяется на все bean-компоненты, вызываемые в указанном методе, и на все bean-компоненты, вызываемые этими bean-компонентами, рекурсивно. Конечно, другие вызванные bean-компоненты могут изменить семантику транзакции своего вызова метода, указав другие параметры @TransactionAttribute (скажем REQUIRES_NEW или NOT_SUPPORTED).

Примечание: транзакции никогда не передаются в bean-компоненты с @TransactionManagement(BEAN). Контейнер будет всегда приостанавливать любую незавершенную транзакцию, прежде чем вызывать метод для bean-управляемой транзакции.

35 голосов
/ 07 марта 2011

из спецификации EJB 3.1

4.5.3 Транзакции

Контекст транзакции клиента не распространяется с асинхронным вызовом метода. С точки зрения разработчика Bean, никогда не возникает контекст транзакции, исходящий от клиента. Это означает, например, что семантика атрибута транзакции REQUIRED в асинхронном методе в точности совпадает с REQUIRES_NEW.

...