[SPRING] Spring 트랜잭션 이해하기 - 트랜잭션 메소드가 다른 트랜잭션 메소드를 호출하면 어떻게 될까?
SPRINGSpring 트랜잭션 이해하기 - 트랜잭션 메소드가 다른 트랜잭션 메소드를 호출하면 어떻게 될까?
Spring 트랜잭션의 동작을 이해하기 위해 @Transactional으로 표시된 메서드가 @Transactional로 표시된 다른 메서드를 호출하는 다음과 같은 경우에 어떤 일이 발생하는지 알고 싶습니다.
구성이 모든 기본 설정을 사용한다고 가정합니다.
@Service("myService")
@Transactional
public MyService{
public void myServiceMethod(){
myDAO.getSomeDBObjects();
}
}
@Repository("myDAO")
@Transactional
public MyDAOWithUsesBeyondMyService{
public void getSomeDBObjects(){...}
}
이제 MyService.myServiceMethod ()를 입력하면 명확하게 트랜잭션을 시작합니다. 그런 다음 myDAO.getSomeDBObjects ()로 드릴링하면 어떻게됩니까? 트랜잭션이 이미 존재한다는 사실로 인해 새로운 트랜잭션이 생성되지 않거나 여기에 두 개의 트랜잭션을 작성합니까?
전파에 대한 문서 (아래 인용)는이 문제를 다루고있는 것으로 보이지만 제 이해력을 확인하고 싶습니다. 처녀 두뇌가 모든 것을 한꺼번에 이해할 수있는 정도였습니다.
해결법
-
==============================
1.두 가지 답변 :
두 가지 답변 :
a)하지 마십시오. @Transactional은 서비스 계층이나 DAO 계층에서 사용하지만 둘 다 사용하지는 마십시오 (서비스 계층 당 보통 하나의 트랜잭션을 원할 수 있으므로 서비스 계층이 일반적입니다)
b) 그렇게하면 일어나는 일은 @Transactional 어노테이션의 전파 속성에 따라 다르며이 단원에서 설명합니다. 10.5.7 트랜잭션 전파. 기본적으로 PROPAGATION_REQUIRED는 PROPAGATION_REQUIRES_NEW가 새 트랜잭션을 시작하는 동안 두 트랜잭션에 동일한 트랜잭션이 사용됨을 의미합니다.
귀하의 의견 :
그것은 귀하의 상황에 맞지 않습니다 (오직 두 가지 방법이 같은 학급에있는 경우에만).
bean이 메소드 a와 b, 그리고 b 호출을 가지고 있다면, b는 프록시가 아니라 실제 메소드에서 호출된다. 왜냐하면 그것이 프록시 내에서 호출되기 때문이다 (bean은 그것이 외부 세계에 프록시되는 것을 모른다 ).
proxy bean a() --> a() | V b() --> b()
그러나 상황에 따라서는 서비스 자체에 프록시가되는 dao 객체가 삽입되어 있으므로 다음과 같은 상황이 발생할 수 있습니다.
proxy bean service a() --> a() | /---------/ | V dao b() --> b()
from https://stackoverflow.com/questions/4171605/understanding-spring-transactions-what-happens-when-a-transactional-method-cal by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 왜 HibernateTemplate이 추천되지 않는가? [복제] (0) | 2018.12.18 |
---|---|
[SPRING] 스프링 프로토 타입 범위의 싱글 톤 (0) | 2018.12.18 |
[SPRING] 프록시를 초기화 할 수 없습니다 - 세션 없음 (0) | 2018.12.17 |
[SPRING] Spring Security에서 'X-Frame-Options'응답 헤더를 비활성화하는 방법은 무엇입니까? (0) | 2018.12.17 |
[SPRING] Spring에서 런타임시 bean (prototype) 등록하기 (0) | 2018.12.17 |