使用 try catch block 时的 Spring @Transactional 注释

标签 spring spring-mvc

如果我们在带有@Transactional注解的方法中捕获到异常,如果发生异常会回滚吗?

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Throwable.class)
public void yearEndProcess() {
    try {
        // try block
    } catch (Throwable throwable) {
        // catch block
    }
}

最佳答案

例如

class A{
    
    @Transactional
    public Result doStuff(){
        Result res = null;
        try {
          // do stuff 
        } catch (Exception e) {
            
        }
        return res ;
    }
}

如果 doStuff 方法中有异常,则 事务不会回滚。

要以编程方式回滚异常,我们可以执行如下操作。

声明式方法

@Transactional(rollbackFor={MyException1.class, MyException2.class, ....})
public Result doStuff(){
   ...
}

程序化回滚

您需要从 TransactionAspectSupport 调用它。

    public Result doStuff(){
      try {
        // business logic...
      } catch (Exception ex) {
        // trigger rollback programmatically
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
      }
    }

如果可能的话,强烈建议您使用 declarative 方法rollbackProgrammatic rollback 是可用的,只有在绝对需要时才应该使用它。

关于使用 try catch block 时的 Spring @Transactional 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25738883/

相关文章:

java - 为什么Spring中的RequestMapping得到空值

java - 跳过 Spring 占位符替换

java - Spring Security OAuth Java 配置

支持事务关联的 Java 或 Spring async TaskExeuctor?

java - @jsonignore 在 spring mvc 中没有按预期工作

spring - 如何配置 Spring Repository 以使用 xml bean 中定义的 mongoTemplate?

java - Spring MVC + Log4j2 在未识别的类路径位置中定义 log4j2.properties 文件

spring-mvc - 使用@Valid时如何设置执行验证的顺序?

java - Spring MVC + Hibernate @Transactional 异常后不回滚

java - GET 请求的 Spring 注解