@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。
我在服务层方法过程中测试@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。