[java] Spring 트랜잭션에서 requires_new와 중첩 된 전파의 차이점

PROPAGATION_REQUIRES_NEWPROPAGATION_NESTED전파 정책 의 동작 차이를 이해할 수 없습니다 . 두 경우 모두 현재 프로세스가 롤백되지만 전체 트랜잭션이 아닌 것 같습니다. 단서가 있습니까?



답변

다음 링크를 참조하십시오. PROPAGATION_NESTED 대 PROPAGATION_REQUIRES_NEW? Juergen Hoeller는 그것을 아주 잘 설명합니다. – 스프링 소스 포럼은 완전히 오프라인 2019년 2월 28일 마부,하지만 당신은 아래의 인용문에서 기사의 관련 부분을 읽을 수 있습니다

PROPAGATION_REQUIRES_NEW는 주어진 범위에 대해 새롭고 독립적 인 “내부”트랜잭션을 시작합니다. 이 트랜잭션은 외부 트랜잭션과 완전히 독립적으로 커밋되거나 롤백되며 자체 격리 범위, 자체 잠금 집합 등이 있습니다. 외부 트랜잭션은 내부 트랜잭션이 시작될 때 일시 중단되고 내부 트랜잭션이 시작되면 다시 시작됩니다. 완료되었습니다. …

반면에 PROPAGATION_NESTED는 기존 트랜잭션의 진정한 하위 트랜잭션 인 “중첩 된”트랜잭션을 시작합니다. 일어날 일은 중첩 된 트랜잭션이 시작될 때 세이브 포인트가 사용된다는 것입니다. 중첩 된 트랜잭션이 실패하면 해당 저장 점으로 롤백합니다. 중첩 트랜잭션은 외부 트랜잭션의 일부이므로 외부 트랜잭션이 끝날 때만 커밋됩니다. …


답변

PROPAGATION_REQUIRES_NEW : 영향을받는 각 트랜잭션 범위에 대해 완전히 독립적 인 트랜잭션을 사용합니다. 이 경우 기본 물리적 트랜잭션이 다르므로 내부 트랜잭션의 롤백 상태에 영향을받지 않는 외부 트랜잭션을 사용하여 독립적으로 커밋하거나 롤백 할 수 있습니다.

PROPAGATION_NESTED : 롤백 할 수있는 여러 세이브 포인트가있는 단일 물리적 트랜잭션을 사용합니다. 이러한 부분 롤백을 사용하면 내부 트랜잭션 범위가 해당 범위에 대한 롤백을 트리거 할 수 있으며, 일부 작업이 롤백 되었음에도 불구하고 외부 트랜잭션이 물리적 트랜잭션을 계속할 수 있습니다. 이 설정은 일반적으로 JDBC 저장 점에 매핑되므로 JDBC 리소스 트랜잭션에서만 작동합니다.

봄 문서 확인


답변

차이점을 찾아주세요

1.) Use of NESTED Transaction

현재 트랜잭션이있는 경우 중첩 된 트랜잭션 내에서 실행하고, PROPAGATION_REQUIRED처럼 동작합니다. 중첩 트랜잭션은 Spring에서 지원합니다.

2.) REQUIRED Transaction 사용 현재 트랜잭션을 지원하고, 존재하지 않으면 새로 만듭니다. . 인출, 입금, 거래 업데이트와 같은 뱅킹 도메인을 의미합니다.

3.) REQUIRES_NEW 트랜잭션 사용 새 트랜잭션을 생성하고 현재 트랜잭션이있는 경우 일시 중지합니다.


답변