首页 > 解决方案 > @Transactional 注释 rollbackFor 值在 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()));
    }
}

我强迫了一个错误。在这样做时,我认为数据不应该存储在容器表中。并且数据应该存储在 retryHistory 表中。

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

你能告诉我为什么吗?

标签: spring-bootspring-data-jpatransactions

解决方案


事务不会回滚,因为您实际上是在函数中处理异常。所以函数没有抛出UnsupportedOperationException,它以返回结束retryHistoryRepository.save

要使其回滚containerRepository.save,您需要将 try-catch 移出函数并让函数抛出异常,然后 spring data 将回滚在该函数内完成的所有操作。如果你想在这个函数中保留逻辑,你也可以使用TransactionTemplate而不是 @Transactional。


推荐阅读