최근에, 나는 거래가 롤백되지 않는 상황을 만났습니다. 또한 JPA의 거래에 버그가 있다고 말하는 것을 고려했습니다. 너무 많이 생각하고 ...
로그를 명확하게 인쇄하려면 Tyrcatch를 추가하여 캐치의 로그를 인쇄합니다. 그러나 여기의 상황은 온다. 이 방법이 비정상적이면 로그가 인쇄되지만 추가 된 트랜잭션은 롤백되지 않습니다.
예:
이와 같은 메소드는 롤백이 아닙니다 (하나의 메소드 오류, 다른 메소드는 롤백하지 않습니다) :
if (userSave) {try {userDao.save (user); usercapabilityquotadao.save (capabilityquota); } catch (예외 e) {logger.info ( "인터페이스를 열 수있는 기능, 계정 열기 예외, 예외 정보 :"+e); }}다음 메소드가 롤백됩니다 (하나의 메소드 오류, 다른 메소드가 롤백됩니다) :
if (userSave) {try {userDao.save (user); usercapabilityquotadao.save (capabilityquota); } catch (예외 e) {logger.info ( "인터페이스를 열 수있는 기능, 계정 열기 예외, 예외 정보 :"+e); 새로운 runtimeexception ()을 던지십시오. }}또는:
if (userSave) {try {userDao.save (user); usercapabilityquotadao.save (capabilityquota); } catch (예외 e) {logger.info ( "인터페이스를 열 수있는 기능, 계정 열기 예외, 예외 정보 :"+e); transactionAspectSupport.currentTransactionStatus (). setRollbackonly (); }}왜 나갈 수 없습니까? ? 봄의 거래 메커니즘을 이해하지 못합니다. ! !
***** 기본 스프링 트랜잭션은 Runtimeexcetpion이 끊임없이 발생하는 경우에만 롤백됩니다. *******
SpringAop Exception Capture의 원리 : 차단 된 방법은 예외를 명시 적으로 던져야하며 어떠한 방식으로도 처리 할 수 없습니다. 이러한 방식으로 AOP 에이전트는 방법을 제외하고 롤백을 할 수 있습니다. 기본적으로 AOP는 runtimeexception을 제외하고는 포착하지만 통과 할 수 있습니다.
특정 예외를 포착하고 롤백하도록 구성하십시오
다시 말해서, 서비스 방법에서 trycatch를 사용하지 않거나, 프로그램이 예외적 일 때 프로그램을 잡아서 롤백 할 수 있도록 Catch에 wrownewruntimeexcetpion ()을 추가하지 마십시오.
해결책:
예를 들어, 서비스 계층이 트랜잭션을 처리하는 경우 서비스의 메소드는 예외 캡처를 수행하지 않거나 Catch 문에 열광적 인 문을 추가하지 않으므로 AOP는 예외를 잡고 롤백하고 서비스 상단 계층 (Webservice Client, View Layer Action)이 예외를 계속 처리하고 처리해야합니다.
솔루션 2. 추가 : transactionAspectSupport.currentTransactionStatus (). setRollbackonly (); 서비스 계층 메소드의 캐치 문에 대한 명령문, 수동 롤백으로 상단 계층이 예외를 처리 할 필요가 없도록하십시오 (현재 프로젝트 실무)
요약
위는 스프링 트랜잭션 예외 롤백 인스턴스 분석에 대한이 기사의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!