내 방법 중 하나에서 @Transactional을 사용하려고합니다. 시나리오 아래 : 등 내가 한 폴더에서 다른 폴더로이 개 파일을 복사 및 파일 정보 등 FILE_NAME와 테이블에 레코드를 삽입하고 싶어하고, file_location,@Transactional이 db 트랜잭션을 롤백하지 않습니다.
:
시나리오 접근 : 여기에 먼저 레코드를 삽입하고 파일을 실제로 옮깁니다. 이 메서드는 @Transactional
으로 주석 처리됩니다.
예상 : 이제 파일을 이동하기 전에 두 파일이 모두 원본 디렉터리에 있는지 확인합니다. 소스에 존재하지 않는다면 insert 문을 롤백해야하는 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을 throw 한 후에도 삽입 항목이 롤백되지 않습니다.
여러 가지에 따라 달라질 수 있습니다. 이걸 어떻게 부르니? 콩의 방법은 무엇입니까? @Transactional로 주석이 달린 다른 메서드에서 메서드를 호출합니까? 당신은 예외를 가로채는가? – StanislavL
개인 메소드를 트랜잭션화할 수 없으며 프록시화할 수 없습니다. –
@StanislavL이 메소드를 간단한 메소드 호출로 사용한다. 밀기울의 메소드도 아니고 다른 Transactional 메소드의 메소드도 아니다. 위의 코드에서'else runtimeException()'을 던져서 else 절의 예외를 가로 챈다. –