2017-12-13 4 views
0

내 방법 중 하나에서 @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 한 후에도 삽입 항목이 롤백되지 않습니다.

+1

여러 가지에 따라 달라질 수 있습니다. 이걸 어떻게 부르니? 콩의 방법은 무엇입니까? @Transactional로 주석이 달린 다른 메서드에서 메서드를 호출합니까? 당신은 예외를 가로채는가? – StanislavL

+1

개인 메소드를 트랜잭션화할 수 없으며 프록시화할 수 없습니다. –

+0

@StanislavL이 메소드를 간단한 메소드 호출로 사용한다. 밀기울의 메소드도 아니고 다른 Transactional 메소드의 메소드도 아니다. 위의 코드에서'else runtimeException()'을 던져서 else 절의 예외를 가로 챈다. –

답변

1

귀하의 경우 @Transactional은 무시됩니다. 대신 트랜잭션이이 메서드를 호출하는 메서드에서 위에 어딘가에 열렸습니다.

@Transactional은 스프링 빈과 publicstatic 메소드에서 작동합니다. Bean이 생성되면 Spring은 트랜잭션 열기/커밋/롤백 로직이 평가되는 프록시를 생성한다.

를 해결하려면 :

  1. 가 만드는 클래스 A 콩
  2. 을하는 방법이 아닌 staticpublic
  3. 확인 호출 방법 트랜잭션을 확인합니다. 이를 무시하려면 전파를 추가하여 REQUIRES_NEW 새 별도의 트랜잭션을 열 수있게하십시오.
+0

도와 주셔서 감사합니다. @StanislavL .. Bean 클래스를 만들기 위해 정확히 무엇이 필요할까요? 어떤 클래스를 Bean으로 변환해야합니까? 저는 스프링 프레임 워크에 매우 익숙합니다. 이해할 수 없으므로 .. 같은 것을 설명하기 위해 당신에게 요청하는 것 .. 도움이 감사합니다. 많이 감사합니다! –

+0

moveFilesAndUpdateDB 메소드를 포함하는 클래스. 설명 하기엔 너무 넓습니다. Spring의 작동 방식과 Transactional의 봄 작동 방식을 읽는 것이 좋습니다. – StanislavL

+0

StanislavL .. 내가해야 할 코드에 대한 모든 참조 링크가 나에게 도움이 될 것입니다 .. 만약 당신이 공유하고 싶다면 –

관련 문제