Java EE 6 CDI事件是事务性的吗?
如果我在事务中触发一个事件,然后回滚该事务,事件侦听器的效果是否也会回滚?
此行为是否依赖于支持事务的事件侦听器本身?
如果我尝试从then事件侦听器中回滚异常,它会回滚触发事件的事务吗?
发布于 2010-11-22 07:32:42
从CDI1.0规范的events chapter中,可以通过指定正在观察的TransactionPhase来将事件定义为“事务性的”,其中TransactionPhase是以下之一:
,
这样的声明看起来像这样:
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }如果观察者没有被声明为“事务性的”,那么容器将立即调用观察者,否则它会注册观察者方法,以便稍后在事务完成阶段使用JTA同步进行调用。
但是:
在事务完成之前调用的任何观察器方法都可以调用setRollbackOnly()来强制回滚事务。观察者方法不能直接启动、提交或回滚JTA事务。
如果观察者方法抛出异常(并且本身不是“事务性的”),则异常中止事件的处理。
因此,为了实现我正在寻找的行为,我相信我会将我的观察者注册为“事务性”,并指定BEFORE_COMPLETION TransactionPhase。然后,如果我想回滚发起该事件的事务,我将调用setRollbackOnly()。
https://stackoverflow.com/questions/4228428
复制相似问题