Spring事务回滚

问题描述 投票:0回答:1

我有函数,并且该函数将在 catch 条件下继续。 我的期望是,每当它遇到条件时,它都应该回滚以前的保存数据。但为什么数据仍然保存在数据库上而不进行回滚。即使我已经使用注释@Transactional

@Transactional
public RpaLog createRpaLogObject(CreateRpaLogObjectRequest request) {
    RpaLog rpaLog = new RpaLog();
    try {
        rpaLog.setFunctionName(request.getFunctionName());
        rpaLog.setStatus(request.getStatus());
        rpaLog.setCreatedDate(HelperUtils.getCurrentTimestamp());
        rpaLog = rpaLogRepository.save(rpaLog);

        String externalApiUrl = rpaConfig.getEndpoint() + rpaLog.getId();
        restTemplate.getForObject(
                externalApiUrl,
                ExternalApiResponse.class
        );
    }catch (Exception e){
        throw new CreationFailedException(MessageConstants.RPA_CREATION_FAILED + request.getFunctionName());
    }

    return rpaLog;
}

顺便说一下,我使用了 Spring Data Commons - CrudRepository 包。 我怎样才能实现回滚?

java spring spring-boot transactions spring-transactions
1个回答
0
投票

尝试修改您的代码,如下所示:

@Transactional(rollbackFor = Exception.class)
public RpaLog createRpaLogObject(CreateRpaLogObjectRequest request) {
    RpaLog rpaLog = new RpaLog();
    try {
        rpaLog.setFunctionName(request.getFunctionName());
        rpaLog.setStatus(request.getStatus());
        rpaLog.setCreatedDate(HelperUtils.getCurrentTimestamp());
        rpaLog = rpaLogRepository.save(rpaLog);

        String externalApiUrl = rpaConfig.getEndpoint() + rpaLog.getId();
        restTemplate.getForObject(
                externalApiUrl,
                ExternalApiResponse.class
        );
    } catch (Exception e) {
        throw new CreationFailedException(MessageConstants.RPA_CREATION_FAILED + request.getFunctionName());
    }

    return rpaLog;
}

要测试回滚是否有效,请在 try 块中模拟异常(例如,通过抛出 RuntimeException)并检查数据库中的数据是否回滚。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.