Spring JPA 中的多事务管理
Multiple transaction management in Spring JPA
我正在使用 Spring 4
、JPA
和 Hibernate 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 代理。
我正在使用 Spring 4
、JPA
和 Hibernate 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 代理。