gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:42:23 24 4
gpt4 key购买 nike

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

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

这种行为是否依赖于事件监听器本身支持事务?

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

最佳答案

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

  • IN_PROGRESS,
  • 完成前,
  • 完成后,
  • AFTER_FAILURE,
  • AFTER_SUCCESS

  • 这样的声明看起来像:
    void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }

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

    然而:

    Any observer method called before completion of a transaction may call setRollbackOnly() to force a transaction rollback. An observer method may not directly initiate, commit or rollback JTA transactions.



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

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

    关于transactions - Java EE 6 CDI 事件是事务性的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4228428/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com