복붙노트

[SPRING] Spring 트랜잭션 이해하기 - 트랜잭션 메소드가 다른 트랜잭션 메소드를 호출하면 어떻게 될까?

SPRING

Spring 트랜잭션 이해하기 - 트랜잭션 메소드가 다른 트랜잭션 메소드를 호출하면 어떻게 될까?

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. ==============================

    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()
    
  2. from https://stackoverflow.com/questions/4171605/understanding-spring-transactions-what-happens-when-a-transactional-method-cal by cc-by-sa and MIT license