【问题标题】:How to rollback transaction if a sql query fails in spring如果春季sql查询失败,如何回滚事务
【发布时间】:2020-01-22 11:45:36
【问题描述】:

我有以下方法:

   public void deleteProject(Project project) {
      employeeRepository.removeEmployeesFromProject(project);
      roleRepository.removeRolesFromProject(project);
      projectRepository.deleteProject(project);
   }

如果任何 sql 查询失败(意外异常),我想回滚并撤消之前完成的操作。因此,如果第三个查询失败,我想撤消前两个查询的更改。有没有办法,最好的方法是什么?我读到了@Transactional 注释,它在一个事务中发送所有查询。我认为如果出现故障可以自动回滚,但只是用 @Transactional 注释方法并没有这样做。

【问题讨论】:

  • 您要查找的术语是 rollback,是的,这就是事务的用途。
  • 将方法标记为@Transactional 还不够吗?因为我在另一个线程中看到这是推荐的解决方案,但它并没有为我做回滚。
  • 然后你要研究为什么它不适合你。您使用的是哪个数据库?
  • 我正在使用 PostgreSQL 数据库。
  • 好。我假设启用了事务管理。 deleteProject 是否在 spring 组件类中(例如@Service),并且您是从类的外部调用方法,因此可以检测到注释并对其进行操作?

标签: java spring hibernate spring-boot jpa


【解决方案1】:

您也可以使用事务来控制回滚。

try{
    Transaction tx = myDAO.getDefaultPersistenceManager().
    tx.begin();
    deleteProject(project);
    tx.commit();
}finally {
    if (tx != null && tx.isActive()) {
        log.trace("rolling back deleting Project");
        tx.rollback();
    }
}

【讨论】:

    【解决方案2】:

    您必须使用 @EnableTransactionManagement 表示您的 Spring Application 类,以使 @Transactional 注释工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2020-11-10
      • 2019-02-10
      • 1970-01-01
      相关资源
      最近更新 更多