복붙노트

[SPRING] Spring @ 트랜잭션 방식 - 참여 트랜잭션

SPRING

Spring @ 트랜잭션 방식 - 참여 트랜잭션

한 DAO에는 2 가지 트랜잭션 방법이 있습니다.

내가 명시적인 속성을 제공하지 않으면,

그러면 어떻게 될까요?

나는 다른 방법으로 하나의 방법을 실행합니까?

두 방법 모두 동일한 하나의 트랜잭션 내에서 실행됩니까?

해결법

  1. ==============================

    1.Transactional을 사용할 때 클래스의 프록시를 다루므로이 시나리오에서 다음을 수행하십시오.

    Transactional을 사용할 때 클래스의 프록시를 다루므로이 시나리오에서 다음을 수행하십시오.

    @Transactional
    public void doSomeThing(){ // calling this method targets a proxy
    
        doSomeThingElse(); // this method targets the actual class, not the PROXY,
                           // so the transactional annotation has no effect
    }
    
    @Transactional
    public void doSomeThingElse(){
    }
    

    외부로부터 프록시를 호출하고 있지만 두 번째 메소드 호출은 프록시 된 객체 내부에서 이루어 지므로 트랜잭션 지원이 없습니다. 당연히 두 번째 메소드에서 @Transactional 어노테이션의 값이 무엇이든 관계없이 같은 트랜잭션에서 실행됩니다.

    별도의 거래가 필요한 경우에는

    yourservice.doSomething();
    yourservice.doSomethingElse();
    

    밖에서.

    전체 시나리오는 Spring AOP> "솔루션"을 포함한 AOP 프록시 이해하기 장에서 잘 설명된다.

    public class SimplePojo implements Pojo {
    
       public void foo() {
          // this works, but... gah!
          ((Pojo) AopContext.currentProxy()).bar();
       }
    
       public void bar() {
          // some logic...
       }
    }
    
  2. ==============================

    2.@Transactional의 전달 속성의 기본값은 REQUIRED이며 이는 다음을 의미합니다.

    @Transactional의 전달 속성의 기본값은 REQUIRED이며 이는 다음을 의미합니다.

    그래서 예 - 두 가지 방법 모두 동일한 트랜잭션에서 실행됩니다.

    그러나 중요한 조언 하나 : DAO를 트랜잭션 화하지 마십시오. 서비스는 DAO가 아니라 트랜잭션이어야합니다.

  3. ==============================

    3.스프링 박사

    스프링 박사

    하나의 메모 :

  4. from https://stackoverflow.com/questions/2865055/spring-transactional-method-participating-transaction by cc-by-sa and MIT license