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

Transactional Method not rolling back for unchecked Exception

@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() 没有被回滚,即使抛出了未经检查的异常。

要检查事务如何使用日志工作,只需将其添加到 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

事务方法没有回滚,因为它有多个数据库连接。所以@Transactional 将回滚唯一的主要配置,我们在应用程序中也只能有一个主要配置。解决方案是使用链式事务。

参考这个link进一步了解链式交易: https://blog.usejournal.com/springboot-jpa-rollback-transaction-with-multi-databases-53e6f2f143d6