Spring Boot @Transactional 翻译

Translation of SpringBoot @Transactional

在我的代码中,我有一个带有 updatePerson(Age age, Address address) 的接口。从 3 个不同的控制器调用此方法。现在由于控制器 1 中的某些要求,我不得不将一个附加字段传递给此方法,如 updatePerson(Age age, Address address, Experience experience).

为了避免在其他2个controller中传递updatePerson(Age age, Address address, null),我想到了将这个方法转换为我接口中的默认方法,并在内部调用另一个方法。所以我的界面现在看起来像:

public interface PersonService
{
   default PersonDO updatePerson(Age age, Address address) {
     return updatePerson(Age age, Address address, null);
   }

   PersonDO updatePerson(Age age, Address address, Experience experience);
}

现在的问题是: 在这个接口的实现中,将原来的updatePerson注解为@Transactional。我知道如果一个普通方法调用一个用 @Transactional 注释的方法,事务就不会工作,因为它由 spring.

处理

所以在现在的实现中我有 updatePerson(Age age, Address address, Experience experience) 用 @Transactional 注释。

直接调用updatePerson(Age age, Address address, Experience experience)的controller,会在事务中执行。但是我不确定当控制器调用 default updatePerson(Age age, Address address) 并在内部调用已实现的方法时会发生什么?执行是否仍然发生在交易中?

您可以将 @Transactional 添加到默认方法,因此它也会在事务中

@Transactional    
default PersonDO updatePerson(Age age, Address address) {
  return updatePerson(Age age, Address address, null);
}