gpt4 book ai didi

即使在非事务方法或 Controller 中捕获异常,Spring 事务方法也会回滚

转载 作者:行者123 更新时间:2023-12-05 07:46:37 24 4
gpt4 key购买 nike

我在非事务性方法中调用 try-catch block 内的两个事务性方法。发生异常时,我能够捕获异常并将其记录下来。第一个事务方法不会回滚,但最后一个会。这种行为是我目前在 spring 事务管理中所理解的。

public void grab(){
try{
requestManager.updateRequest();
requestManager.saveTicket()
}catch (DataIntegrityViolationException dive) {
if (dive.getCause() instanceof ConstraintViolationException) {
LOGGER.error("ConstraintViolationException",dive);
}
}
}

在上面的代码中,ConstraintViolationException 发生在 saveTicket() 方法内部并且 saveTicket() 内部的 dao 甚至在捕获异常之前就已经回滚了它的事务(这就是我所知道的),并且第一个没有回滚因为它在另一个事务中。(这是我已经知道的行为)。

当我使用另一种调用这两个预览方法(updateRequest() 和 saveTicket())的事务方法时,我感到困惑,当 saveTicket() 方法中发生 ConstraintViolationException 时,即使捕获异常,它甚至会回滚 updateRequest() 方法.这是我的代码

 public void grab(){
try{
requestManager.grabRequest();
}catch (DataIntegrityViolationException dive) {
if (dive.getCause() instanceof ConstraintViolationException) {
LOGGER.error("ConstraintViolationException",dive);
}
}
}

我所知道的是,这两种方法将在 grabRequest() 方法中加入相同的事务,但我的问题是,为什么即使我正在捕获异常,事务也会回滚?这是否意味着 spring 使用的代理甚至在我捕获异常之前就已经回滚了事务?

最佳答案

Does this mean that the proxy that spring uses already rolled back the transaction even before i catch the exception?

是的,在 JPA/Spring 注释中,您可以在 @Transactional

中指定您的事务管理器必须回滚或不得回滚的异常列表

In its default configuration, the Spring Framework’s transaction infrastructure code only marks a transaction for rollback in the case of runtime, unchecked exceptions; that is, when the thrown exception is an instance or subclass of RuntimeException. ( Errors will also - by default - result in a rollback). Checked exceptions that are thrown from a transactional method do not result in rollback in the default configuration.

来自 http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html

对于 JPA,它是 rollbackOndontRollbackOn

关于即使在非事务方法或 Controller 中捕获异常,Spring 事务方法也会回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40604203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com