当前位置: 首页 > 面试题库 >

仅标记为回滚的事务:如何找到原因

袁鸿雪
2023-03-14
问题内容

我在@Transactional方法中提交事务时遇到问题:

methodA() {
    methodB()
}

@Transactional
methodB() {
    ...
    em.persist();
    ...
    em.flush();
    log("OK");
}

当我从methodA()调用methodB()时,该方法成功通过,并且可以在日志中看到“确定”。但后来我明白了

Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
    at methodA()...
  1. 在异常中完全缺少methodB的上下文-我想可以吗?
  2. methodB()中的某些内容将事务标记为仅回滚?我如何找到它?例如,有没有一种方法可以检查类似的东西getCurrentTransaction().isRollbackOnly()?-这样,我可以逐步检查方法并找到原因。

问题答案:

我终于明白了这个问题:

methodA() {
    methodB()
}

@Transactional(noRollbackFor = Exception.class)
methodB() {
    ...
    try {
        methodC()
    } catch (...) {...}
    log("OK");
}

@Transactional
methodC() {
    throw new ...();
}

发生的是,即使methodB的注释正确,methodC但没有。引发异常后,第二个异常@Transactional将第一个事务标记为“仅回滚”。



 类似资料:
  • 问题内容: 我在@Transactional方法中提交事务时遇到问题: 当我从methodA()调用methodB()时,该方法成功通过,并且可以在日志中看到“确定”。但后来我明白了 在异常中完全缺少methodB的上下文-我想这可以吗? methodB()中的某些内容将事务标记为仅回滚?我如何找到它?例如,是否有一种检查类似方法的方法-这样,我可以逐步检查方法并找到原因。 问题答案: 我终于明白

  • 问题内容: 我在@Transactional方法中提交事务时遇到问题: 当我从methodA()调用methodB()时,该方法成功通过,并且可以在日志中看到“确定”。但后来我明白了 在异常中完全缺少methodB的上下文-我想这可以吗? methodB()中的某些内容将事务标记为仅回滚?我如何找到它?例如,是否有一种检查类似方法的方法-这样,我可以逐步检查方法并找到原因。 问题答案: 当你将方法

  • 我在@transactional方法中提交事务时遇到问题: 当我从methodA()调用methodB()时,该方法成功传递,并且我可以在日志中看到“OK”。但我得到 异常中完全缺少methodB的上下文-我想这可以吗? methodB()中的内容将事务标记为仅回滚?我怎么才能查出来?例如,是否有一种方法来检查类似这样,我可以逐级遍历该方法并找到原因。

  • 我有这样的场景: 从IncomingMessage表中获取(读取和删除)记录 读取记录内容 在某些表中插入某些内容 如果在步骤1-3中出现错误(任何异常),请将错误记录插入OutgoingMessage表 否则,将成功记录插入OutgoingMessage表 因此步骤1、2、3、4应该在事务中,或者步骤1、2、3、5 但是当SqlCommandHandlerService.persist()抛出异

  • 我在我正在开发的一个应用程序中使用了Spring和Hibernate,我在处理事务时遇到了一个问题。 我有一个服务类,它从数据库中加载一些实体,修改它们的一些值,然后(当一切都有效时)将这些更改提交给数据库。详细地说: 我得到的错误是这样的: Main.java: RegionService.java:

  • 我有一个类,它有一个标记为@Transactional的方法。从该方法中,会调用多个标记为@Transactional的方法。所以,从层次上讲,这就像有一个父事务和多个子事务。当我调用从数据库获取数据的方法,然后最终调用一个应该将数据存储在数据库中的方法时,就会出现问题,然后事务提交失败,并用“