Подтвердить что ты не робот

Режим транзакции по умолчанию EJB для асинхронных методов?

  • Когда у меня есть метод @Asynchronous в EJB, и я не указываю @TransactionAttribute, то как именно контейнер обрабатывает границы транзакций? Очевидно, что он не может использовать транзакцию вызывающего потока, так что он делает?

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


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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

4.5.3 Транзакции

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