代码之家  ›  专栏  ›  技术社区  ›  Brian Leathem

JavaEE6CDI事件是事务性的吗?

  •  13
  • Brian Leathem  · 技术社区  · 14 年前

    JavaEE6CDI事件是事务性的吗?

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

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

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

    1 回复  |  直到 12 年前
        1
  •  16
  •   Brian Leathem    14 年前

    events chapter 在CDI 1.0规范中,可以通过指定要观察的TransactionPhase来将事件定义为“transactional”,其中TransactionPhase是:

    • 在进展中,
    • 在完成之前,
    • 完成后,
    • 失败后,
    • 成功后

    这样的声明看起来像:

    void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
    

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

    然而:

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

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

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