我有一个案例,我需要以相同的方法发起对四个不同服务的调用。根据我们的业务逻辑,所有四个步骤都必须成功,否则回滚。问题在于,由于所有步骤都发生在同一个事务中(通过 @Transactional 注释),因此该方法中的第二个调用无法处理第一个的结果。我在第一次调用时尝试了 Propagation.REQUIRES_NEW ,但是由于它启动了一个新事务,因此无论其他调用是否成功,它所做的更改都会被提交并且不会回滚。在某些时候,Propagation.NESTED 似乎可以完成这项工作,但我得到一个 NestedTransactionNotSupportedException,它警告我将 nestedTransactionAllowed 属性设置为 true。但我找不到任何关于如何做到这一点的文件。有任何想法吗?并且也将不胜感激任何其他关于该问题的建议。
根法:
@Override
@Transactional
public GuestUserDto createGuestUser(GuestUserRegisterRequest existingGuestUser) {
guestUserDeactivationDelegateService.deactivateGuestUser(existingGuestUser);
UserDto userDto = guestUserRegistrationDelegateService.registerGuestUser(
guestUserRegisterDtoConverter.convert(existingGuestUser));
createGuestUserAddress(existingGuestUser);
guestUserRegisterHistoryService.createRegisterHistory(
guestUserRegistrationHistoryDtoBuilder.build(userDto.getMemberId(), existingGuestUser));
return guestUserDtoConverter.convert(userDto);
}
停用方法:
@Transactional
public void deactivateGuestUser(GuestUserRegisterRequest existingUser) {
deactivateSmsVerification(existingUser.getMemberId());
String emailPlaceholder = existingUser.getMemberId() + existingUser.getEmail();
userGraphClientService.updateUserStatus(createUserRequest(existingUser.getMemberId()));
updateGuestUserStatus(existingUser.getMemberId(), emailPlaceholder);
}