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


80

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


7
이 링크를 참조하십시오 : forum.springsource.org/archive/index.php/t-16594.html - 위르겐 Hoeller 아주 잘 설명
랄프

@Ralph : 감사합니다. 바로 제가 찾던 것입니다. 답변으로 추가해야합니다.
Alexis Dufrenoy 2012 년

1
@Ralph : 좋습니다. 그게 최선의 대답이 될 것입니다.
Nandkumar Tekale 2012 년

1
따라서 가장 큰 차이점은 중첩 된 트랜잭션 정책을 사용하면 requires_new 정책과 동일하지만 전체 프로세스가 끝날 때만 커밋됩니다. 이는 각 원자 적 작업이 종료 될 때 커밋되는 requires_new 정책과 완전히 다릅니다.
Alexis Dufrenoy 2012 년

1
@Ralph 불행히도 귀하의 링크는 더 이상 기존 페이지를 가리 키지 않습니다. :(
knittl

답변:


117

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

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

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


좋은 대답과 좋은 질문입니다. 여러분의 의견과 다음 링크는 나를 위해 매우 유용했다 : byteslounge.com/tutorials/...
yaki_nuka

propagation_requires_new에서 설명한 올바른 동작입니까? 내가 확인했을 때 두 트랜잭션을 모두 롤백합니다.
eatSleepCode 2015-10-16

중첩 된 트랜잭션이 실패하면 (그것도 실패할까요?) 외부 트랜잭션 동작을 명확히하십시오. 그 반대의 경우도 마찬가지입니다
gstackoverflow

따라서 중첩 트랜잭션을 사용하면 내부 트랜잭션이 롤백되면 외부 트랜잭션이 저장 지점에서 계속되는 반면 외부 트랜잭션이 롤백되면 모든 작업이 롤백됩니다.
Wecherowski

행동에 차이가 있습니까?
gstackoverflow

14

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

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

봄 문서 확인


2
예, 밑줄 차이는 이해하지만 어떻게 다르게 작동하는지 알 수 없습니다. 어떤 경우에는 a를 이전 저장 점으로 롤백하고 다른 경우에는 외부 트랜잭션이 아닌 현재 트랜잭션을 롤백하지만 실제로 두 경우 모두 현재 원자 연산의 시작 부분으로 롤백하고 해당 지점에서 다시 시작합니다.
Alexis Dufrenoy 2012 년

1
@Traroth : @Ralph의 링크에있는 두 줄은 동작의 차이를 알려줍니다. PROPAGATION_REQUIRES_NEW: 외부 트랜잭션은 내부 트랜잭션이 시작될 때 일시 중단되고 내부 트랜잭션이 완료되면 재개됩니다. 각 내부 트랜잭션이 완료되면 커밋 / 롤백됩니다. PROPAGATION_NESTED: 중첩 된 트랜잭션은 외부 트랜잭션의 일부이므로 외부 트랜잭션이 끝날 때만 커밋됩니다.
Nandkumar Tekale 2012 년

나는 동의한다. 그래서 나는 그에게 그의 말에 대한 대답을 제안했다.
Alexis Dufrenoy 2012 년

1
@Traroth : 동의합니다. :) 그는 최고의 대답을 가지고 있습니다.
Nandkumar Tekale 2012 년

-6

차이점을 찾아주세요

1.) Use of NESTED Transaction

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.