@Transactional 注释 rollbackFor 值在 spring 引导中不起作用

@Transactional annotation rollbackFor values does not working in spring boot

我在服务层方法过程中测试@Transactional 回滚。

在我的代码下方。

@Transactional(rollbackFor = UnsupportedOperationException.class)
public RetryHistory failedOnCreateContainer() {
    final Container container = new Container();

    try {
        Container savedContainer = containerRepository.save(container);
        throw new UnsupportedOperationException("Force Error");
    } catch(UnsupportedOperationException e) {
        log.error("Error : {}", e.getMessage());
        return retryHistoryRepository.save(new RetryHistory(container.getName()));
    }
}

我逼错了。这样做时,我认为数据不应该存储在容器中table。并且数据应该存储在 retryHistory table.

但出乎我意料的是,数据也存储在了容器table中。

你能告诉我为什么吗?

事务没有回滚,因为你实际上是在函数内部处理异常。所以函数没有抛出UnsupportedOperationException,它以返回retryHistoryRepository.save.

结束

为了回滚containerRepository.save,你需要把try-catch移到函数外面,让函数抛出异常,然后spring数据会回滚所有已经完成的事情在该功能内。如果您想将逻辑保留在此函数中,也可以使用 TransactionTemplate 而不是 @Transactional。