【问题标题】:EJB CMT : Transaction Rollback Does not rollback the persisted dataEJB CMT : Transaction Rollback 不回滚持久化的数据
【发布时间】:2013-06-19 16:40:17
【问题描述】:
  1. 我有一个使用 TransactionAttribute.REQUIRES_NEW 注释的 EJB 方法 methodA()。
  2. methodA() 调用在远程服务器上运行的两个 EJB 方法(比如说 methodB()、methodC())(IIOP 通信)
  3. methodB() 执行少量数据库插入。methodB 也使用 TransactionAttribute.REQUIRED 进行注释
  4. methodC() 也用 TransactionAttribute.REQUIRED 注释,我让它抛出一些运行时异常来测试事务管理。
  5. 当我测试我的方法 A 以进行事务管理时,我注意到以下 ..

在 OpenEJB 日志中,

  1. TX Requires_New:没有要暂停的事务。

  2. TX Requires_New : 已启动事务 ... gerenimo TransactionImpl....

  3. 方法 B 执行的日志...完成。

  4. methodC 抛出一些 RuntimeException

  5. TX Requires_New:回滚事务...

============

即使它说事务正在回滚.. 通过 methodA() 保存的数据库记录仍然出现在数据库中。我希望数据库插入也应该回滚。

您能帮我了解一下可能出了什么问题吗?

【问题讨论】:

    标签: transactions ejb datasource rollback


    【解决方案1】:

    问题在于方法A、B和C在不同的事务上下文中运行,因此,在您的进程中,有三个不同且独立的事务在隔离中执行。

    每个应用服务器定义一个事务上下文,它由部署在同一服务器中的 EJB 共享。

    当您调用在远程服务器中运行的 EJB 时,不使用当前事务。

    如果你想在不同的远程服务器上共享同一个事务,你必须实现一个分布式事务。

    【讨论】:

    • methodB 和 methodC 在同一台服务器上,它们是第三方 EJB。文档说,如果我们提供将在执行 B 和 C 时使用的事务。现在如何确保分布式事务是从我的 EJB 方法 A 实现的?
    • 好的,但是即使 methodB() 和 methodC() 在同一台服务器上运行,情况也是一样的,因为 methodA() 是调用者。如果methodB()调用methodC()会有所不同,在这种情况下,在C中抛出运行时异常将回滚插入B中的数据,因为它们在相同的事务上下文中运行。老实说,分布式事务是一个很大的话题,也许this 可以是一个很好的起点。另外,请尝试根据您的应用服务器和 EJB 的版本查找示例。
    • 感谢 Gabriel,我做了一些阅读并意识到,这可能是我在 OPenEJB/Websphere 上运行的 EJB 的一方我不需要做任何事情,因为它已经被 Contrainer 托管,并且我的 EJB 上没有定义数据源(即方法A)。你知道如何确定远程 EJB(methodB 和 methodC)是否支持分布式事务吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多