【问题标题】:Can I roll back a JTA transcation after I commit it?我可以在提交 JTA 事务后回滚它吗?
【发布时间】:2011-07-29 02:31:43
【问题描述】:

我有一个我提交的 JTA 交易。提交后可以回滚吗?如果是,如何?我有以下情况。

  1. 我有一个更新了 3 个数据库的后端层。我已经为此使用了 JTA 用户事务。如果任何数据库中的更新失败,则使用 utx.rollback 回滚对 3 个数据库的所有更新

  2. 现在我在后端层之上有一个层,用于更新其他一些数据库。现在我希望第 1 步和第 2 步都成功或都失败,所以我想回滚第 1 步的 JTA 事务,以防第 2 步失败。

我很难将第 2 步的代码放入第 1 步,因为我们在第 2 步中使用一些现有的 API 来更新数据库。

【问题讨论】:

    标签: java jpa jta


    【解决方案1】:

    您不能在提交后回滚事务。

    【讨论】:

    • 如果您标记事务并使用它来回滚。但是,这实际上取决于具体情况。
    【解决方案2】:

    我认为答案是您无法使用 JTA 或其他 RDBM 执行此类操作。

    事务要么提交,要么回滚。一旦成功提交,它们就无法回滚。

    唯一可能的“退出”可能是尝试使用嵌套事务,并回滚外部事务。但这可能行不通:

    • 并非所有 JTA 实现都支持嵌套事务。
    • 即使他们这样做了,也不能保证外部事务会成功提交。这可能会让您提交的“其他”数据库和 JTA 事务回滚。

    听起来您将不得不重新考虑您的持久性 API。

    【讨论】:

      【解决方案3】:

      据我所知,您无法回滚已提交的事务。底层数据库将不支持它。例如,oracle 不允许已提交的事务回滚。

      当然有一种方法可以返回到以前的状态,术语称为“时间点恢复”。 Oracle 的时间点恢复机制称为 FlashBack。

      http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28424/adfns_flashback.htm

      这将允许您将数据库状态恢复到以前的快照。

      但问题是,没有 JTA 接口来执行此操作。 (事实上​​它超出了事务管理器的范围。)

      最好的办法是在您的事务中注册保存点,而不是在一个或多个操作失败时提交并回滚到保存点。

      【讨论】:

        【解决方案4】:

        您无法回滚已提交的事务,无论它是 XA 事务还是非 XA 事务。

        要解决您提到的问题,必须在单个 XA 事务中包含所有涉及的资源。

        如果上述解决方案由于某种原因不可行,您可以这样做: a) 要求第一层(3 个 DB)准备。 b) 如果 (a) 的结果正常,则提交第 4 个 DB。 c) 如果 (b) 的结果是 OK,则在 3 个 DB 上调用第二阶段提交。

        HTH。

        谢谢, 尼丁

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-27
          • 2012-04-13
          • 1970-01-01
          相关资源
          最近更新 更多