【发布时间】:2018-05-26 23:15:32
【问题描述】:
我正在尝试在我的一种方法中使用@Transactional。以下场景:
场景:我将 2 个文件从一个文件夹复制到另一个文件夹,并希望在表中插入一条记录,其中包含文件详细信息,例如 file_name、file_location等
方法:这里我先插入一条记录,然后实际移动文件。这个方法被注释为@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 之后,插入条目不会被回滚。
【问题讨论】:
-
它可能取决于多种因素。你怎么称呼这个?是bean的方法吗?您是否从另一个用@Transactional 注释的方法调用该方法?你拦截异常了吗?
-
你不能使私有方法具有事务性,它们不能被代理。
-
@StanislavL 我将此方法称为简单的方法调用。麸皮的方法和其他事务方法都不是。我通过执行
throw new RuntimeException()来拦截上面代码中提到的 else 子句中的异常 -
@Transactionalonprivate方法不起作用。@Transactional上的static方法不起作用。你正在做这两个...... -
是的.. 我现在删除了
private和static
标签: spring sql-insert jdbctemplate rollback transactional