我有一个JTA transcation,我承诺。我提交后可以回滚吗?如果有,怎么样?我有以下情况。
我有一个更新3个DB的后端层。我已经使用了JTA用户transcation。如果任何数据库中的更新失败,则使用utx.rollback
现在我在后端层上面有一个图层,用于更新其他一些数据库。现在我希望第1步和第2步都成功或两者都失败,所以我想回滚第1步的JTA转换,以防第2步失败。
我很难将第2步的代码放入1中,因为我们在步骤2中使用一些现有的API来更新数据库。
答案 0 :(得分:3)
提交后,您无法回滚事务。
答案 1 :(得分:2)
我认为答案是你不能使用JTA或其他RDBM做这样的事情。
交易已提交,或已回滚。一旦成功提交,就无法回滚。
唯一可能的“out”可能是尝试使用嵌套事务,并回滚外部事务。但这可能不起作用:
听起来你将不得不重新考虑你的持久性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。
谢谢, 尼丁