有没有办法“重播”交易?我的意思是,有时我得到回滚异常并回滚事务。我是否可以“克隆”事务并重试,或者调用回滚后,事务将丢失?我真的需要更改,真的不想跟踪每个更改以便以后重新运行。。。谢谢,乌迪
mhd8tkvw1#
这取决于交易的来源。在java/jdbc中,事务绑定到连接。你先设定一个 setAutoCommit() 为false(否则,每个语句都会成为自己的小事务)。在事务失败后(即您调用了rollback),没有任何东西阻止您重用连接。当你使用spring时,事情变得更加棘手。spring将您的方法 Package 在一个事务处理程序中,这个处理程序尝试从方法中抛出的异常中猜测它应该对当前事务做什么。下一个问题是:哪个 Package 器创建了当前事务?我刚刚遇到了一个调用方法的例子 foo() 这反过来又会 bar() ,两者 @Transactional .我想从中发现错误 bar() 在 foo() 并保存到数据库中。这不起作用,因为事务是为 foo() (因此,我仍在进行一项spring认为在 bar() )它不会让我保存错误。解决办法是创造 baz() ,来吧 @Transactional(propagation=Propagation.REQUIRES_NEW) 并从 foo() . baz() 将获得一个新的、新鲜的事务,并且能够写入数据库,即使它是从 foo() 已经有一个(坏的)交易。
setAutoCommit()
foo()
bar()
@Transactional
baz()
@Transactional(propagation=Propagation.REQUIRES_NEW)
3hvapo4f2#
为什么一开始就有例外?在我看来,这似乎是问题的关键。你依赖乐观的写作吗?如果是这样,那么您必须以某种形式的循环来 Package 数据库写入,包括(也许)一次回退和多次重试。不幸的是,您不能自动执行此操作(除非您研究某种形式的aop解决方案,用重试策略 Package 您的数据库写入?)
a2mppw5e3#
另一种选择是使用jdbc保存点部分回滚。
3条答案
按热度按时间mhd8tkvw1#
这取决于交易的来源。在java/jdbc中,事务绑定到连接。你先设定一个
setAutoCommit()
为false(否则,每个语句都会成为自己的小事务)。在事务失败后(即您调用了rollback),没有任何东西阻止您重用连接。
当你使用spring时,事情变得更加棘手。spring将您的方法 Package 在一个事务处理程序中,这个处理程序尝试从方法中抛出的异常中猜测它应该对当前事务做什么。下一个问题是:哪个 Package 器创建了当前事务?我刚刚遇到了一个调用方法的例子
foo()
这反过来又会bar()
,两者@Transactional
.我想从中发现错误
bar()
在foo()
并保存到数据库中。这不起作用,因为事务是为foo()
(因此,我仍在进行一项spring认为在bar()
)它不会让我保存错误。解决办法是创造
baz()
,来吧@Transactional(propagation=Propagation.REQUIRES_NEW)
并从foo()
.baz()
将获得一个新的、新鲜的事务,并且能够写入数据库,即使它是从foo()
已经有一个(坏的)交易。3hvapo4f2#
为什么一开始就有例外?在我看来,这似乎是问题的关键。
你依赖乐观的写作吗?如果是这样,那么您必须以某种形式的循环来 Package 数据库写入,包括(也许)一次回退和多次重试。不幸的是,您不能自动执行此操作(除非您研究某种形式的aop解决方案,用重试策略 Package 您的数据库写入?)
a2mppw5e3#
另一种选择是使用jdbc保存点部分回滚。