0

我有一个案例,我需要以相同的方法发起对四个不同服务的调用。根据我们的业务逻辑,所有四个步骤都必须成功,否则回滚。问题在于,由于所有步骤都发生在同一个事务中(通过 @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);
    }
4

1 回答 1

0

似乎主要原因是 Hibernate 的刷新操作顺序,因为它优先于插入更新。在 DAO 层更新后手动刷新解决了这个问题。

于 2022-01-05T08:26:49.587 回答