Bri*_*hem 13 transactions cdi java-ee-6
Java EE 6 CDI事件是事务性的吗?
如果我在事务中触发事件,然后回滚事务,那么事件侦听器的效果是否也会回滚?
此行为是否依赖于支持事务的事件侦听器本身?
如果我尝试从事件监听器内部回滚异常,那么它是否回滚触发事件的事务?
Bri*_*hem 16
从CDI 1.0规范的事件章节,可以通过指定正在观察的TransactionPhase将事件定义为"事务性",其中TransactionPhase是以下之一:
这样的声明如下:
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
Run Code Online (Sandbox Code Playgroud)
如果未将观察者声明为"事务性",则容器立即调用观察者,否则它将使用JTA同步在事务完成阶段注册观察者方法以便稍后调用.
然而:
在完成事务之前调用的任何观察者方法都可以调用setRollbackOnly()来强制事务回滚.观察者方法可能不直接启动,提交或回滚JTA事务.
如果观察者方法抛出异常(并且本身不是"事务性"),则异常将中止事件的处理.
因此,为了实现我正在寻找的行为,我相信我会将我的观察者注册为"事务性",并指定BEFORE_COMPLETION TransactionPhase.如果我想回滚发起事件的事务,我会调用setRollbackOnly().