我提交后可以回滚JTA事务吗?

时间:2011-01-22 07:21:58

标签: java jpa jta

我有一个JTA transcation,我承诺。我提交后可以回滚吗?如果有,怎么样?我有以下情况。

  1. 我有一个更新3个DB的后端层。我已经使用了JTA用户transcation。如果任何数据库中的更新失败,则使用utx.rollback

  2. 回滚对3个DB的所有更新
  3. 现在我在后端层上面有一个图层,用于更新其他一些数据库。现在我希望第1步和第2步都成功或两者都失败,所以我想回滚第1步的JTA转换,以防第2步失败。

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

4 个答案:

答案 0 :(得分:3)

提交后,您无法回滚事务。

答案 1 :(得分:2)

我认为答案是你不能使用JTA或其他RDBM做这样的事情。

交易已提交,或已回滚。一旦成功提交,就无法回滚。

唯一可能的“out”可能是尝试使用嵌套事务,并回滚外部事务。但这可能不起作用:

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

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

答案 2 :(得分:1)

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

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

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

这将允许您将数据库状态还原为以前的快照。

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

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

答案 3 :(得分:0)

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

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

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

HTH。

谢谢, 尼丁