首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java EE 6 CDI事件是事务性的吗?

Java EE 6 CDI事件是事务性的吗?
EN

Stack Overflow用户
提问于 2010-11-20 03:02:05
回答 1查看 6.7K关注 0票数 16

Java EE 6 CDI事件是事务性的吗?

如果我在事务中触发一个事件,然后回滚该事务,事件侦听器的效果是否也会回滚?

此行为是否依赖于支持事务的事件侦听器本身?

如果我尝试从then事件侦听器中回滚异常,它会回滚触发事件的事务吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-22 07:32:42

从CDI1.0规范的events chapter中,可以通过指定正在观察的TransactionPhase来将事件定义为“事务性的”,其中TransactionPhase是以下之一:

  • BEFORE_COMPLETION,

  • AFTER_COMPLETION,

  • AFTER_FAILURE,

  • AFTER_SUCCESS

  • IN_PROGRESS

这样的声明看起来像这样:

代码语言:javascript
运行
复制
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }

如果观察者没有被声明为“事务性的”,那么容器将立即调用观察者,否则它会注册观察者方法,以便稍后在事务完成阶段使用JTA同步进行调用。

但是:

在事务完成之前调用的任何观察器方法都可以调用setRollbackOnly()来强制回滚事务。观察者方法不能直接启动、提交或回滚JTA事务。

如果观察者方法抛出异常(并且本身不是“事务性的”),则异常中止事件的处理。

因此,为了实现我正在寻找的行为,我相信我会将我的观察者注册为“事务性”,并指定BEFORE_COMPLETION TransactionPhase。然后,如果我想回滚发起该事件的事务,我将调用setRollbackOnly()。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4228428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档