问题描述
在服务层方法过程中对@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。