我想在我的一个方法中使用@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之后,插入条目也没有回滚。
答案 0 :(得分:1)
在您的情况下@Transactional
被忽略。相反,在调用此方法的方法中,上面某处打开了事务。
@Transactional
适用于Spring bean和public
非static
方法。创建bean时,Spring会创建一个代理,用于评估事务打开/提交/回滚逻辑。
修复:
static
和public
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();
}
}