【问题标题】:When should I use `REQUIRED` vs `NOT_SUPPORTED` as a the value of @TransactionAttribute for an MDB?我什么时候应该使用 `REQUIRED` 和 `NOT_SUPPORTED` 作为 MDB 的 @TransactionAttribute 的值?
【发布时间】:2014-07-29 23:59:52
【问题描述】:

我了解容器管理事务 (CMT)。我也知道枚举类型TransactionAttributeTypedifferent possible values。由于客户端从不直接调用 MDB,除 REQUIREDNOT_SUPPORTED 之外的属性类型对 MDB 没有意义,因为没有客户端启动的事务要加入。那么我什么时候应该用REQUIREDNOT_SUPPORTED 来注释MDB 的onMessage() 方法呢?没有提到这两个选项的默认行为是什么?

【问题讨论】:

    标签: java transactions jms ejb-3.0 jta


    【解决方案1】:

    这两个选项中没有一个的默认行为是 提到了吗?

    Container 管理的 MDB 的默认行为是 NOT_SUPPORTED

    那么我什么时候应该用 REQUIRED vs NOT_SUPPORTED?

    使用 NOT_SUPPORTED 意味着 - 如果在 onMessage() 中发生故障 - 在故障之前发生的任何更新/操作都不会回滚;这对于涉及不同资源的原子操作是不可取的。

    如果您不希望这种行为,请使用REQUIRED,在onMessage() 中放置一个try/catch,并在发生任何异常时在catch() 中调用setRollbackOnly()。如果onMessage() 正在跨不同资源执行多个操作,您将需要 XA 驱动程序;例如,在同一个事务中更新数据库和发送新的 JMS 消息肯定需要 XA 兼容的驱动程序。

    MDB 仅支持 REQUIRED 或 NOT_SUPPORTED

    MDB 可以使用REQUIREDNOT_SUPPORTED 事务属性;其他属性没有意义,因为它们需要客户端上下文。

    容器总是在调用onMessage() 之前启动一个新事务。如果从onMessage() 调用另一个方法,则容器会传递当前事务上下文。

    【讨论】:

    • 我有一个后续问题。那么在调用onMessage(..) 方法之前,容器是否总是创建事务呢?在那种情况下,设置 REQUIRED 属性只会加入容器启动的事务吗?还有为什么默认行为NOT_SUPPORTED。似乎默认应该是SUPPORTED
    • 更新答案,拉菲人
    • 你能回答为什么默认行为是 NOT_SUPPORTED 吗?
    【解决方案2】:

    我对这个讨论很感兴趣。我确信规范表明默认事务属性是必需的。

    另一个stackoverflow讨论中的一些人:

    What is the default TRANSACTION ATTRIBUTE for MDBS?

    谈到了 Weblogic 服务器实现的异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2023-04-02
      • 2012-12-23
      相关资源
      最近更新 更多