[SPRING] @Transactional 어노테이션없이 다른 메소드를 호출하는 트랜잭션 메소드?
SPRING@Transactional 어노테이션없이 다른 메소드를 호출하는 트랜잭션 메소드?
@Transactional으로 표시된 Service 클래스의 메서드를 보았지만 @Transactional로 표시되지 않은 동일한 클래스의 다른 메서드도 호출하고있었습니다.
분리 된 메소드에 대한 호출로 인해 응용 프로그램이 DB에 대한 개별 연결을 열거 나 부모 트랜잭션을 일시 중단하고 있음을 의미합니까?
@Transactional 어노테이션으로 다른 메소드에 의해 불려지는 어노테이션이없는 메소드의 기본 동작은 무엇입니까?
해결법
-
==============================
1.트랜잭션 블록 내에서 @Transactional없이 메소드를 호출하면 상위 트랜잭션은 새 메소드로 계속 진행됩니다. 상위 메소드 (@Transactional)와 동일한 연결을 사용하고 호출 된 메소드에서 발생한 예외 (@Transactional을 사용하지 않으면 트랜잭션 정의에서 구성된대로 트랜잭션이 롤백됩니다.
트랜잭션 블록 내에서 @Transactional없이 메소드를 호출하면 상위 트랜잭션은 새 메소드로 계속 진행됩니다. 상위 메소드 (@Transactional)와 동일한 연결을 사용하고 호출 된 메소드에서 발생한 예외 (@Transactional을 사용하지 않으면 트랜잭션 정의에서 구성된대로 트랜잭션이 롤백됩니다.
동일한 인스턴스 내에서 @Transactional이있는 메서드에서 @Transactional 주석을 사용하여 메서드를 호출하면 호출 된 메서드의 트랜잭션 동작이 트랜잭션에 아무런 영향을 미치지 않습니다. 그러나 트랜잭션 정의가있는 다른 메소드의 트랜잭션 정의가있는 메소드를 호출하고 다른 인스턴스에있는 메소드를 호출하면 호출 된 메소드의 코드는 호출 된 메소드에서 제공된 트랜잭션 정의를 따릅니다.
Spring 트랜잭션 문서의 선언적 트랜잭션 관리 섹션에서 더 자세한 정보를 찾을 수 있습니다.
Spring 선언적 트랜잭션 모델은 AOP 프록시를 사용합니다. AOP 프록시는 트랜잭션 생성을 담당합니다. AOP 프록시는 인스턴스에있는 메소드가 인스턴스 외부에서 호출되는 경우에만 활성화됩니다.
-
==============================
2.그것은 전파 수준에 달려 있습니다. 다음은 가능한 모든 수준 값입니다.
그것은 전파 수준에 달려 있습니다. 다음은 가능한 모든 수준 값입니다.
예를 들어 전파 수준이 중첩 된 경우 현재 트랜잭션이 "일시 중단"되고 새 트랜잭션이 생성됩니다 (참고 : 중첩 트랜잭션의 실제 생성은 특정 트랜잭션 관리자에서만 작동합니다)
기본 전달 레벨 ( "동작"이라고하는 것)은 필수입니다. @Transactional 어노테이션이 있거나 XML을 통해 선언적으로 트랜잭션 된 "내부"메소드가 호출되는 경우 동일한 트랜잭션 내에서 실행됩니다 (예 : "새로운 것은 없습니다"가 만들어집니다.
-
==============================
3.@Transactional은 트랜잭션 경계 (begin / end)를 표시하지만 트랜잭션 자체는 스레드에 바인딩됩니다. 트랜잭션이 시작되면 원래 메서드가 반환되고 트랜잭션이 커밋되거나 롤백 될 때까지 메서드 호출간에 전파됩니다.
@Transactional은 트랜잭션 경계 (begin / end)를 표시하지만 트랜잭션 자체는 스레드에 바인딩됩니다. 트랜잭션이 시작되면 원래 메서드가 반환되고 트랜잭션이 커밋되거나 롤백 될 때까지 메서드 호출간에 전파됩니다.
@Transactional 어노테이션이있는 다른 메소드가 호출되면 전파는 해당 어노테이션의 전파 속성에 따라 달라집니다.
from https://stackoverflow.com/questions/6222600/transactional-method-calling-another-method-without-transactional-anotation by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring CORS 'Access-Control-Allow-Origin'헤더가 없습니다. (0) | 2018.12.22 |
---|---|
[SPRING] log4j : WARN web.xml에서 logger에 대한 appender를 찾을 수 없습니다. (0) | 2018.12.22 |
[SPRING] Spring에서 현재 ApplicationContext 가져 오기 (0) | 2018.12.22 |
[SPRING] 데이터베이스에 의존하지 않고 스프링 - 부트 응용 프로그램을 시작하는 방법은 무엇입니까? (0) | 2018.12.22 |
[SPRING] 스프링 부트 : 뚱뚱한 항아리가있는 임의의 디렉토리에서 외부 application.properties 파일을 사용할 수 있습니까? (0) | 2018.12.22 |