Spring @Transactional未回滚数据库事务

Spring @Transactional未回滚数据库事务,spring,sql-insert,jdbctemplate,rollback,transactional,Spring,Sql Insert,Jdbctemplate,Rollback,Transactional,我试图在我的一个方法中使用@Transactional。情况如下: 场景:我将两个文件从一个文件夹复制到另一个文件夹,并希望在表中插入一条记录,其中包含文件详细信息,如文件名,文件位置等 方法:这里我先插入一条记录,然后实际移动文件。此方法被注释为@Transactional 应为:现在在移动我正在检查的文件之前,如果源目录中存在这两个文件。如果它们在源代码中不存在,那么我将抛出RuntimeException(),它将回滚insert语句 实际:抛出异常后,插入项不会回滚 @Transacti

我试图在我的一个方法中使用@Transactional。情况如下:

场景:我将两个文件从一个文件夹复制到另一个文件夹,并希望在表中插入一条记录,其中包含文件详细信息,如文件名文件位置

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

应为:现在在移动我正在检查的文件之前,如果源目录中存在这两个文件。如果它们在源代码中不存在,那么我将抛出
RuntimeException()
,它将回滚insert语句

实际:抛出异常后,插入项不会回滚

@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之后,插入项也不会回滚

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

@Transactional
适用于Springbeans和
public
静态
方法。创建bean时,Spring将创建一个代理,在其中计算事务打开/提交/回滚逻辑

要修复:

  • 把这个班变成豆子
  • 使方法非
    静态
    公共
  • 检查调用方法事务。要忽略它,添加传播
    需要\u NEW
    打开一个新的单独事务

  • 除了上述答案之外,您还需要在@Transactional之后添加(rollboor=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();
      }
    }
    

    这可能取决于多种因素。这叫什么?豆子的方法是什么?您是否从另一个用@Transactional注释的方法调用该方法?您是否拦截异常?您不能使私有方法成为事务性的,它们不能被代理。@StanislavL我将此方法称为简单的方法调用。。既不是bran方法,也不是其他事务方法。我截获了上述代码中提到的else子句中的异常,方法是对
    private
    方法执行
    抛出新RuntimeException()
    @Transactional
    <静态方法上的code>@Transactional无效。你两者都在做…是的。。我现在删除了
    private
    static
    谢谢你的帮助@StanislavL。。你能告诉我我需要做什么来创建类Bean吗?我应该将哪个类转换为Bean。。我对spring框架非常陌生。。所以我无法理解。。请你解释一下。。谢谢你的帮助。。多谢!包含moveFilesAndUpdateDB方法的类。太宽泛了,无法解释。最好阅读Spring的工作原理以及Spring中事务性的工作原理。。任何关于我需要做的代码的参考链接也会对我有所帮助。。如果你有请分享我认为没有一个单一的例子或链接。谷歌更好,因为我不知道适合初学者的好资源。此外,在这里寻找图书馆或教程也不是主题。