gpt4 book ai didi

java - 自动将 XAResources 登记/清理到新 Tx 中的方法?

转载 作者:行者123 更新时间:2023-11-30 05:06:27 26 4
gpt4 key购买 nike

因为 TransactionManager 无法注册 XAResource 管理器,以便它可以在将来的 Transaction 中登记 XAResource。

解决这个问题的唯一方法是包装感兴趣的服务接口(interface)的句柄。接口(interface)上的每个方法都执行以下操作:

  • 检查是否存在交易
  • 找出该交易的句柄
  • 如果尚未参与,请使用 Transaction.enlist(XAResource) 登记其 XAResource
  • 使用 Transaction.registerSynchronization(Synchronization) 注册回调以启用清理。

这看起来是一个合理的策略吗?

最佳答案

这是一个合理的初稿,但有一些微妙之处需要注意。自己解决极端情况很困难 - 您最好为代码编写一个资源适配器并让 JCA 处理事务管道,这是大多数数据库和消息队列驱动程序所做的。

  • 仅仅因为存在 tx 上下文,并不意味着您可以加入 tx。特别是,如果 tx 被标记为仅回滚,则规范要求 enlistResource 抛出 RollbackException。

  • 仅仅因为上下文存在并且 tx 在您检查时具有有效状态,并不意味着它在方法调用的整个生命周期中保持存在或有效。您可以获得竞争条件,其中 TM 调用资源回滚,而您的业务逻辑仍在运行。

  • 由于 XA 的 C 传统,XAResource 对象实例、服务接口(interface)实例和事务之间的关系并不是特别优雅。在面向连接的 API(例如 JDBC)中,通常每个连接有一个 XAResource,该 XAResource 实例可能管理多个 tx 上下文。对于无连接 API,您可以使用其他可能更简单的模式。

  • 同步不是必需的。它也不一定是可取的,因为同步是不稳定的,因此在崩溃恢复情况下不会调用您的清理操作。在非启发式情况下,最好在提交/回滚时进行清理。

关于java - 自动将 XAResources 登记/清理到新 Tx 中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4953509/

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