Spring-Java Things 롤백 실패 처리 최근에 프로젝트 작업을하고 있었고 실수로 클래스가 롤백 작동을 던지고 있음을 발견했으며 데이터가 데이터베이스에 정상적으로 삽입되었으므로 조심스럽게 확인하고 특정 이유를 살펴 보았습니다.
모든 것은 여전히 Java의 확인 된 예외 및 확인되지 않은 예외로 시작합니다.
그렇다면 검사 유형 예외는 무엇이며 검사 유형 예외는 무엇입니까?
가장 간단한 판단 지점은 두 가지 있습니다.
1. runtimeexception 또는 오류에서 상속되지 않은 예외 예외는 예외에서 예외에서 상속되어 있습니다 (물론 Runtimeexception 자체는 예외의 서브 클래스이기도합니다).
2. 점검되지 않은 예외는 잡히지 않고 잡을 수 있으며, 확인 된 예외는 시도로 처리되어야합니다. 캐치 문 블록 또는 우수한 처리 방법에 대한 예외를 전달해야합니다. 요컨대, 코드는이를 처리하기 위해 작성해야합니다.
Java의 예외 구조는 아래 그림에 나와 있습니다. 그 중에서도 직접 예외를 물려받는 예외는 잡히고 예외를 확인해야합니다.
내 코드를 되돌아 보자.
1. 메소드 이름은 다음과 같습니다
@transactional
2. 스프링 구성 파일 ApplicationContext-xxx.xml에는 Spring Things에 대한 관련 구성이 있습니다.
<bean id = "transactionManager"> <property name = "dataSource"ref = "dataSource"/> <속성 이름 = "rollbackoncommitFailure"value = "true"> </property> </bean>
그러나 시도 후 제출 된 것이 왜 ... 캐치 던지기 예외 예외는 서비스 계층 메소드를 호출 할 때 롤백되지 않습니까?
관련 스프링 문서를 확인한 후, 원래의 스프링 선언 트랜잭션 관리는 기본적으로 확인되지 않은 예외 및 런타임 예외에서 트랜잭션 롤백을 수행하고 확인 된 예외에는 롤백이 없음을 발견했습니다.
시도가 던진 예외 ... 코드의 캐치는 점검 유형 예외입니다. Spring의 프레임 워크는 기본적으로 롤백되지 않습니다.
프로그래밍에서 확인되지 않은 예외는 피할 수있는 반면, 확인 된 예외는 시도 명령문 블록으로 처리하거나 우수한 방법으로 전달해야합니다. 요컨대, 코드를 처리하려면 코드를 작성해야합니다.
따라서 예외는 서비스에 포착 된 다음 거래가 적용되도록 수동으로 확인되지 않은 예외를 다시 던져야합니다. 예를 들어:
시도 {………} catch (예외 e) {……… 새로운 BusinessException (e.getMessage ()); }물론, 우리는이 문제를 해결하는 더 쉬운 방법, 즉 매개 변수에 주석을 달아 기본 롤백 메소드를 변경합니다.
Norollbackfor 및 Rollbackfor는 @transaction 주석에 정의되어 특정 예외가 롤백되는지 여부를 지정합니다.
예제 사용 :
@transaction (norollbackfor = runtimeexception.class)
@transaction (Rollbackfor = Exception.class)
따라서 위의 질문에서는 롤백 매개 변수 @transaction (Rollbackfor = Exception.class)을 직접 추가하여 기본 트랜잭션 처리 방법을 변경할 수 있습니다.
시현:
이를 위해서는 예외를 사용자 정의 할 때 runtimeexception에서 사용자 정의 예외를 상속해야하므로 던져지면 Spring의 기본 트랜잭션 처리에 의해 정확하게 처리됩니다.
요약
위는 Java Transaction Rollback의 실패 문제에 대한이 기사의 전체 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!