当前位置: 首页 > 知识库问答 >
问题:

未检查异常的事务方法不回滚

斜和硕
2023-03-14
@Service
public class TransactionClass{

    @AutoWire
    TransactionClass tranClass;

    @Autowire
    TransactionRepository transRepo;

    public void methodA(Data data){
        try{
             methodB(data)
        }catch(Exception e){
            //some logic
        }
   }

   public void methodB(Data data){
       //some logic
       tranClass.methodC(data)
   }

  @Transactional
  public void methodC(Data data){
      //some logic
      transRepo.save(data);
      throw new RuntimeException();
  }
}

问题是即使抛出了未检查的异常,methodC()也不会回滚。

共有1个答案

闾丘书
2023-03-14

要检查事务如何使用日志工作,只需将其添加到application.yaml

logging.level.org.springframework.transaction.interceptor: TRACE
logging.level.org.springframework.orm.jpa.JpaTransactionManager: DEBUG

logging.level.org.hibernate.SQL: DEBUG
spring.jpa.properties.hibernate.use_sql_comments: true
 类似资料:
  • 在上面的代码中,我将hibernate与mysql一起使用,hibernate会话由SpringSessionContext管理(在事务边界下使用SessionFactory.CurrentSession类) 下面的镜像(dao层)是直接的用例,但是异常没有回滚,我从简单的服务层调用这个方法(即服务层调用dao层进行CRUD操作),我了解了spring在事务管理上的代理机制,在这种情况下,下面的镜

  • 我用的是spring-boot和JPA。我试图捕捉未检查的异常,如(违反约束)引发的事务。即使我添加了catch块,它也会在超出事务边界时抛出。 我谷歌了一下,发现可以通过事务回调来实现。我尝试了下面的代码:仍然是给出错误 请帮帮我!!

  • 尽管捕获了RuntimeException并声明了noRollbackFor属性,但事务总是回滚。有什么解释吗?? 日志跟踪信息:

  • 问题内容: 我在一个带有旧服务层的项目上工作,如果请求的记录不存在,或者由于调用者未得到授权而无法访问,则在很多地方返回null。我说的是ID要求的特定记录。例如,类似: 最近,我一直在努力更改此API,或者用引发异常的新API进行补充。随之而来的是关于检查与未检查的异常的争论。 从JPA / Hibernate等所有设计师的笔记中,我建议未检查的异常可能是最合适的。我的观点是,不能合理地期望AP

  • 这很好,但并不总是在代码中抛出运行时异常。因此,我挖掘并发现如下所示的rollbackFor; 现在,我必须更改所有代码,以使用RollBackfor更改@Transactional。但是还有其他方法可以将所有@transaction advice属性更改为rollbackFor=exception.class吗?

  • 因为Java编程语言不需要捕获方法或声明未检查异常(包括 RuntimeException、Error及其子类),程序员可能会试图编写只抛出未检查异常的代码,或使所有异常子类继承自RuntimeException。这两个快捷方式都允许程序员编写代码,而不必担心编译器错误,也不用担心声明或捕获任何异常。虽然这对于程序员似乎很方便,但它避开了捕获或者声明异常的需求,并且可能会导致其他人在使用您的类而产