Работает ли CDI @Transactional(Transactional.TxType.REQUIRES_NEW), когда вызывается внутри одного и того же компонента:
@Transactional
public void method1() {
for(...) {
method2();
}
}
@Transactional(Transactional.TxType.REQUIRES_NEW)
public void method2() {
...
}
Я предполагаю, что это не работает, потому что локальные звонки не могут быть перехвачены прокси. В этом случае, каков рекомендуемый шаблон использования, если я хочу управлять каждым вызовом метода2 в новой транзакции. Очевидным является создание еще одного bean-компонента, но мне это не нравится.
try
/catch
в вашемmethod1
Что произойдет, если одна изmethod2
транзакций завершится неудачно? Транзакция вокругmethod1
действительно все еще действительна? Обычно транзакции дают вам семантику «все или ничего», и с вашим приведенным выше фрагментом кода я изо всех сил пытаюсь увидеть преимущество вложенной транзакции. FWIW, согласно SRP, вы, скорее всего, все еще хотите переместитьmethod2
в другой компонент, в частности, если его значение/вариант использования даже оправдывает новую транзакцию. - person Alexander Langer   schedule 22.03.2015