1

세 가지 스프링 구성 요소를 사용하여 first-> second-> third를 호출합니다. 첫 번째와 세 번째 트랜잭션에 @Transactional 어노테이션 만있는 경우 트랜잭션이 제대로 전파됩니까?Spring : 사이에 @Transactional 주석을 추가해야합니까?

@Component public class C1 { 
    @Autowired C2 c2; 

    @Transactional public method1() { 
    ... 
    c2.method2(); 
    } 
} 

@Component public class C2 { 
    @Autowired C3 c3; 

    public method2() { 
    ... 
    c3.method3(); 
    } 
} 

@Component public class C3 { 
    @Transactional public method3() { 
    ... 
    } 
} 
+0

두 답변은 모두 맞고 내 질문에 대한 답변입니다. 나는 조금 혼란 스럽다. Sotirios가 처음 이었지만 두 번째 대답은 더 자세한 내용을 가지고 있습니다. – Artem

+0

첫 번째 대답을 선택하겠습니다. – Artem

답변

1

예, Transaction은 thread-bound입니다. method2()이 실행 중일 때 동일한 Thread에서 실행되므로 현재 Transaction에 액세스 할 수 있습니다. method3()도 마찬가지입니다. 그 어떤 방법에 표시된 경우

아래로

1

@Transactional 작품을 우리는 값이 기본값 또는 RequiredNew에 필요한 될 수있는 속성라는 전파를 지정할 수 있습니다.

샘플이다 @Transactional (읽기 전용 = TRUE, 전파 = Propagation.REQUIRES_NEW) 공개 무효 것으로 someMethod() {

anotherMethod();

}

기본적으로이 "필수"다음 모든 방법은 각 방법 여부에 @Transactional 선언 여부에 상관없이의 전체 스톤 전파에 대한 단일 트랜잭션을 유지 단지 속성 인 경우.

그래서 모든 메소드 실행은 동일한 트랜잭션에서 이루어지며 마지막 메소드에서 롤백이 발생하면 메소드가 호출 될 때까지 영향을줍니다.

속성이 "RequiredNew"로 설정된 경우 각 메소드는 고유 한 트랜잭션에서 실행되므로 한 메소드의 롤백은 다른 메소드 트랜잭션을 롤백하지 않습니다.

희망 하시겠습니까?

관련 문제