Java中回滚异常的处理

Java中回滚异常的处理,java,transactions,rollback,Java,Transactions,Rollback,有没有办法“重播”交易? 我的意思是,有时我会得到RollbackException并回滚事务。然后我是否可以“克隆”事务并重试,或者一旦调用回滚,事务将丢失? 我真的需要这些更改,我真的不想跟踪每个更改以便以后重新运行 谢谢, udi首先为什么会出现异常?在我看来,这似乎是问题的症结所在 你依赖乐观的写作吗?如果是这样的话,那么您将不得不以某种形式的循环来包装您的数据库写入,包括(可能)回退和多次重试。不幸的是,您无法自动执行此操作(除非您研究某种形式的解决方案,使用重试策略包装数据库写入?,

有没有办法“重播”交易? 我的意思是,有时我会得到RollbackException并回滚事务。然后我是否可以“克隆”事务并重试,或者一旦调用回滚,事务将丢失? 我真的需要这些更改,我真的不想跟踪每个更改以便以后重新运行

谢谢,
udi

首先为什么会出现异常?在我看来,这似乎是问题的症结所在


你依赖乐观的写作吗?如果是这样的话,那么您将不得不以某种形式的循环来包装您的数据库写入,包括(可能)回退和多次重试。不幸的是,您无法自动执行此操作(除非您研究某种形式的解决方案,使用重试策略包装数据库写入?

,这取决于事务的来源。在Java/JDBC中,事务绑定到连接。首先,将
setAutoCommit()
设置为false(否则,每个语句都会成为自己的小事务)

在事务失败后(即,您调用了回滚),没有任何东西阻止您重用连接

当您使用Spring时,事情会变得更加棘手。Spring将您的方法包装在一个事务处理程序中,这个处理程序尝试从方法中抛出的异常中猜测它应该对当前事务做什么。下一个问题是:哪个包装器创建了当前事务?我刚刚遇到了一个例子,我将调用一个方法
foo()
,该方法将依次调用
bar()
,两者都是
@Transactional

我想在
foo()
中捕获
bar()
中的错误,并将它们保存到数据库中。这不起作用,因为事务是为
foo()
创建的(因此我仍然在一个Spring认为被
bar()
中的异常打破的事务中),它不允许我保存错误


解决方案是创建
baz()
,使其成为事务性的(传播=传播。需要新的),并从
foo()调用它
baz()
将获得一个新的、新的事务,并且能够写入数据库,即使它是从已经有一个(断开的)事务的
foo()
调用的。

另一种选择是使用部分回滚。

据我所知,savepoing在这种特定情况下没有帮助,原因回滚到上一个保存点不会保留以后更新的数据。。