@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表中。

但与我的预期相反,数据也存储在容器表中。

你能告诉我为什么吗?

解决方法

不会回滚事务,因为您实际上是在函数中处理异常。因此该函数没有抛出UnsupportedOperationException,而是返回了retryHistoryRepository.save

要使其回滚containerRepository.save,您需要将try-catch移到函数外部,并让函数抛出异常,然后spring数据将回滚在该函数中完成的所有操作。如果要将逻辑保留在该函数中,也可以使用TransactionTemplate代替@Transactional。