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

Java 事务性方法不回滚未检查的异常,java,spring,jpa,exception,transactions,Java,Spring,Jpa,Exception,Transactions,问题是methodC()没有回滚,即使抛出了未检查的异常。要使用日志检查事务的工作方式,只需将其添加到应用程序中。yaml @Service public class TransactionClass{ @AutoWire TransactionClass tranClass; @Autowire TransactionRepository transRepo; public void methodA(Data data){ try{

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

要使用日志检查事务的工作方式,只需将其添加到
应用程序中。yaml

@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();
  }
}

@v、 日志中的ladynev确实显示回滚已启动,但每次数据都保存在数据库中

10-11-2020 16:54:50.221[fcef5a02c2fb4941/28df25ce03f36cfe][http-nio-8082-exec-8]调试org.springframework.orm.jpa.JpaTransactionManager.doBegin-将jpa事务公开为JDBC[org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@527770c1] 10-11-2020 16:54:50.222[fcef5a02c2fb4941/28df25ce03f36cfe][http-nio-8082-exec-8]TRACE org.springframework.transaction.interceptor.TransactionInterceptor.prepareTransactionInfo-获取[com.sample.TransactionClass.methodC]的事务 10-11-2020 16:54:50.224[fcef5a02c2fb4941/28df25ce03f36cfe][http-nio-8082-exec-8]TRACE org.springframework.transaction.interceptor.TransactionInterceptor.CompleteTransactionActionAfterThrough-异常后完成[com.sample.TransactionClass.methodC]的事务:java.lang.RuntimeException 10-11-2020 16:54:50.225[fcef5a02c2fb4941/28df25ce03f36cfe][http-nio-8082-exec-8]TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute.rollbackOn-应用规则确定事务是否应在java.lang.RuntimeException上回滚 10-11-2020 16:54:50.226[fcef5a02c2fb4941/28df25ce03f36cfe][http-nio-8082-exec-8]TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute.rollbackOn-成功回滚规则为:null 10-11-2020 16:54:50.227[fcef5a02c2fb4941/28df25ce03f36cfe][http-nio-8082-exec-8]TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute.rollbackOn-未找到相关回滚规则:应用默认规则 10-11-2020 16:54:50.228[fcef5a02c2fb4941/28df25ce03f36cfe][http-nio-8082-exec-8]DEBUG org.springframework.orm.jpa.JpaTransactionManager.processRollback-启动事务回滚 10-11-2020 16:54:50.229[fcef5a02c2fb4941/28df25ce03f36cfe][http-nio-8082-exec-8]调试org.springframework.orm.jpa.JpaTransactionManager.doRollback-在EntityManager上回滚jpa事务[SessionImpl(281191562)] 10-11-2020 16:54:50.405[fcef5a02c2fb4941/28df25ce03f36cfe][http-nio-8082-exec-8]调试org.springframework.orm.jpa.JpaTransactionManager.doCleanupAfterCompletion-交易后不关闭预绑定的jpa实体管理器 10-11-2020 16:54:50.405[fcef5a02c2fb4941/28df25ce03f36cfe][http-nio-8082-exec-8]错误com.sample.TransactionClass.methodC-异常: java.lang.RuntimeException:null 在com.sample.TransactionClass.methodC(TransactionClass.java:110)上 在com.sample.TransactionClass$$FastClassBySpringCGLIB$$a876827.invoke()上 位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) 位于org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749) 在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:163)上 位于org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:294) 位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) 位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186)
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)

事务性方法不回滚,因为它有多数据库连接。因此@Transactional将回滚到唯一的主配置,并且在应用程序中也只能有一个主配置。解决方案是使用链式事务

有关链接交易的更多信息,请参阅此链接:

因为
methodC()
没有dupe中解释的正在进行的事务。唯一的交易将发生在
transRepo.save(数据)中。但我只希望回滚在methodC中发生。但即使运行时异常在transRepo.save(data)之后抛出;静态数据保存在数据库中。哦,我没有注意到您正在为
TransactionClass
进行自注入。这是它通常应该如何工作的,因此错误可能在实际代码中的某个地方。如何调用methodC?@Mick
methodC()
是使用
TransactionClass
的引用调用的。
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