@Transactional没有回滚db事务

时间:2017-12-13 06:15:21

标签: spring sql-insert jdbctemplate rollback transactional

我想在我的一个方法中使用@Transactional。下面的情景:

场景:我正在将2个文件从一个文件夹复制到另一个文件夹,并希望在表格中插入包含文件详细信息的记录,例如 file_name file_location < / strong>等。

方法:这里我首先插入一条记录,然后实际移动文件。此方法注释为@Transactional

预期:在移动我正在检查的文件之前,如果,两个文件都存在于源目录中。如果它们在源代码中不存在,那么我正在抛出RuntimeException(),它应该回滚插入语句。

实际:抛出异常后,插入条目不会回滚。

@Transactional
private static void moveFilesAndUpdateDB(srcFile1, srcFile2, destinationDir) throws RuntimeException
{
    jdbcTemplate.update("insert into ......");
    Boolean sourceFileExists = sourceFilePresentCheck(srcFile1, srcFile2);
    if(sourceFileExists)
    {
        //code to dopy files
    }
    else
    {
        throw new RuntimeException();
    }
}

在抛出RuntimeException之后,插入条目也没有回滚。

2 个答案:

答案 0 :(得分:1)

在您的情况下@Transactional被忽略。相反,在调用此方法的方法中,上面某处打开了事务。

@Transactional适用于Spring bean和publicstatic方法。创建bean时,Spring会创建一个代理,用于评估事务打开/提交/回滚逻辑。

修复:

  1. 将类设为Bean
  2. 使方法非staticpublic
  3. 检查调用方法事务。要忽略它,请添加传播REQUIRES_NEW以打开新的单独事务。

答案 1 :(得分:0)

除上述答案外,还需要在@Transactional之后添加(rollbackFor = RuntimeException.class)。

@Transactional(rollbackFor = RuntimeException.class)
private static void moveFilesAndUpdateDB(srcFile1, srcFile2, destinationDir) throws RuntimeException
{
  jdbcTemplate.update("insert into ......");
  Boolean sourceFileExists = sourceFilePresentCheck(srcFile1, srcFile2);
  if(sourceFileExists)
  {
    //code to dopy files
  }
  else
  {
    throw new RuntimeException();
  }
}