Из главы событий спецификации CDI 1.0 можно определить событие как «транзакционное», указав TransactionPhase, который наблюдает, где TransactionPhase - одно из:
- IN_PROGRESS
- BEFORE_COMPLETION
- AFTER_COMPLETION
- AFTER_FAILURE,
- AFTER_SUCCESS
Такая декларация выглядит так:
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
Если наблюдатель не объявлен «транзакционным», то контейнер немедленно вызывает наблюдателя, в противном случае он регистрирует метод наблюдателя для последующего вызова на этапе завершения транзакции, используя синхронизацию JTA.
Тем не менее:
Любой метод наблюдателя, вызванный до завершения транзакции, может вызвать setRollbackOnly () для принудительного отката транзакции. Метод наблюдателя не может напрямую инициировать, фиксировать или откатывать транзакции JTA.
Если метод наблюдателя выдает исключение (и сам по себе не является "транзакционным"), то исключение прерывает обработку события.
Итак, чтобы добиться нужного мне поведения, я считаю, что я бы зарегистрировал своего наблюдателя как «транзакционного» и указал BEFORE_COMPLETION TransactionPhase. Затем я бы вызвал setRollbackOnly (), если бы я хотел откатить транзакцию, которая инициировала событие.