spring-boot - @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 data 将回滚在该函数内完成的所有操作。如果你想在这个函数中保留逻辑,你也可以使用TransactionTemplate而不是 @Transactional。
推荐阅读
- python - 从 json 转换为纯文本,为什么我不能从我的 json 中读取?
- java - Spark数据集获取与整数列标题相同的数据
- excel - 使用哪种语言自动将数据从网站提取到 Excel?
- c++ - (具有向量的结构)的向量
- qt - 使用 Qml Map 动画轴承属性变化
- jwt - 两个 API 都使用 JWT 身份验证。如何在两者之间进行身份验证?
- java - 为什么 java ExecutorService execute 需要一个新的 Runnable 实现
- c# - 在不打开新连接的情况下获取 DbDataReader
- apache-nifi - 如何在 Nifi 中使用 MergeConent 处理器
- python - 如何在以下 Python 代码中权衡 lasso 回归的观察结果?