Spring JPA 中的多事务管理

Multiple transaction management in Spring JPA

我正在使用 Spring 4JPAHibernate 5。我有如下服务:

@Transactional(rollbackFor = Exception.class)
public methodA() {
  // do some stuff
  methodB();
}

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public methodB() {
  try {
    methodC();
  } catch (Exception e) {
    // only log
  }
}


@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public methodC() {
  // do some stuff
}

我想要实现的是:当调用 methodA 时,调用 methodB 之前执行的所有内容都应该保留,独立于之后发生的事情。为此,我添加了methodB,其唯一目的是创建一个新的事务,所以如果methodC的事务回滚,methodA的原始事务也不会回滚。所以总而言之,我希望第一个事务提交,第二个事务在失败的情况下回滚。请注意,methodC 不能以任何方式更改。

但是这段代码不起作用,我仍然遇到异常:"TransactionException: Transaction was marked for rollback only; cannot commit"

对我做错了什么有什么想法吗?

I am using Spring 4, JPA and Hibernate 5. I have a service as follows:

所以你在同一个服务

中使用了三种方法

这一亮点很重要,因为 spring AOP 的工作方式。

如果您在同一个 class 中调用方法,则其他方法不会被 @Transaction 代理,因此它们仍在使用 methodA 的相同事务。 因此,当交易被 methodB

标记为 rollbackOnly 时,您将看到异常

所以要解决这个问题:您必须将方法 methodB 移动到另一个服务,以便它可以被 Spring 代理。