【发布时间】:2021-05-31 13:20:30
【问题描述】:
我正在 Spring Boot 中尝试使用 @transactional。我已经编写了一个包含多个表插入的服务,如果有任何异常,我希望整个事情都回滚。
这工作正常,但不是抛出导致回滚的实际异常,我得到Unexpected Rollback Exception
@transactional
public void insertIntoTables(){
repositoryone.save(new Table1());
repositorytwo.save(new Table2()); //expecting data integrity violation exception on this line
}
上面的代码不是抛出DataIntegrityViolationException,而是抛出Unexpected Rollback Exception。我当然希望回滚发生,只是想避免异常,以便我可以使用实际的。
如何获取实际异常以进行处理?
【问题讨论】:
-
你在哪里扔
DataIntegrityViolationException?如果你想抛出它而不是UnexpectedRollbackException,那么用try-catch块包围save方法,捕获UnexpectedRollbackException,然后抛出你想抛出的异常。 -
那是因为在提交期间发生了异常。如果您想在提交之前触发约束检查,请执行
saveAndFlush(假设您正在为您的存储库扩展JpaRepository)或直接在EntityManager上调用flush。 Thatt 将在提交之前触发与数据库的状态同步,并为您提供另一个DataAccessException。
标签: java mysql spring spring-data-jpa spring-transactions