짧은 대답은 아니오입니다.이 메서드는 커밋을 기다리지 않습니다.
- 트랜잭션 메소드를 호출하기 전에 존재 : 실제로 어떻게됩니까
는 두 가지 요인에 따라 달라집니다?
- 트랜잭션 전파가 어떻게 사용됩니까?
트랜잭션이 미리 존재하지 않으면 메소드를 호출하기 전에 새 트랜잭션이 생성되고 롤백으로 만 표시되지 않은 경우 Spring은 메소드가 반환 된 후 즉시 커밋하려고 시도합니다. 메소드가 커밋을 기다리지 않으면 커밋이 즉시 실행됩니다. 때문에 중첩 호출로, 트랜잭션 annoted 메서드를 호출 할 때, 실제 거래는 이미 봄 참조 설명서에서
추출 존재하는 동안
상황이 어려워 갈 :
전파 설정이 PROPAGATION_REQUIRED, 인 논리 트랜잭션 범위는 설정이 적용되는 각 메소드에 대해 작성됩니다. 이러한 각 논리적 트랜잭션 범위는 롤백 전용 상태를 개별적으로 결정할 수 있으며 외부 트랜잭션 범위는 내부 트랜잭션 범위와 논리적으로 독립적입니다. 물론 표준 PROPAGATION_REQUIRED 동작의 경우 이러한 모든 범위가 동일한 실제 트랜잭션에 매핑됩니다. 따라서 내부 트랜잭션 범위에 설정된 롤백 전용 마커는 실제로 외부 트랜잭션의 커밋 기회에 영향을줍니다.
PROPAGATION_REQUIRES와 달리 PROPAGATION_REQUIRES_NEW는 영향을받는 트랜잭션 범위마다 완전히 독립적 인 트랜잭션을 사용합니다. 이 경우 내부 물리적 트랜잭션은 다르기 때문에 내부 트랜잭션의 롤백 상태에 영향을받지 않는 외부 트랜잭션을 사용하여 독립적으로 커밋하거나 롤백 할 수 있습니다.
PROPAGATION_NESTED는 롤백 할 수있는 여러 세이브 포인트가있는 단일 물리적 트랜잭션을 사용합니다. 이러한 부분 롤백을 사용하면 내부 트랜잭션 범위에서 해당 범위에 대한 롤백을 트리거 할 수 있으며 일부 트랜잭션은 롤백되었지만 물리적 트랜잭션을 계속할 수 있습니다.
즉, PROPAGATION_REQUIRES_NEW를 제외하고는 포함 트랜잭션이 끝나기 전에 커밋을 시도하지 않습니다. 당신이 커밋 트랜잭션 annoted 방법의 종료 후 즉시 발생하려면
말했다 다르게, 당신은 PROPAGATION_REQUIRES_NEW에 전파를 설정해야합니다 : 그것은 기다리지 않습니다 @Transactional(propagation=Propagation.REQUIRES_NEW)
, 그냥 방법과에서를 실행 끝나면 커밋되거나 롤백됩니다. –