복붙노트

[SPRING] 클래스 대 메소드에서 @Transactional을 정의하는 것의 차이점은 무엇입니까?

SPRING

클래스 대 메소드에서 @Transactional을 정의하는 것의 차이점은 무엇입니까?

@Transactional
public class UserServiceImpl implements UserService {

    ...................
    public void method1(){
        try{
            method2();
        }catch(Exception e){

        }
    }
    public void method2(){

    }
}
public class UserServiceImpl implements UserService {

    ...................
    public void method1(){
        try{
            method2();
        }catch(Exception e){

        }
    }
    @Transactional
    public void method2(){

    }
}

case1에서 예외가 발생하면 롤백이 작동하지만 케이스 2에서는 작동하지 않습니다. 사례 1을 수행하면 성능 문제가 있습니까?

해결법

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

    1.@ 클래스에 대한 트랜잭션은 서비스의 각 메소드에 적용됩니다. 그것은 바로 가기입니다. 일반적으로 모든 메소드가 저장소 계층에 액세스한다는 것을 알고 있으면 서비스 클래스에서 @Transactional (readonly = true)을 설정할 수 있습니다. 그런 다음 모델에서 변경 작업을 수행하는 메서드에서 @Transactional을 사용하여 비헤이비어를 재정의 할 수 있습니다. 1)과 2) 사이의 성능 문제는 알려져 있지 않습니다.

    @ 클래스에 대한 트랜잭션은 서비스의 각 메소드에 적용됩니다. 그것은 바로 가기입니다. 일반적으로 모든 메소드가 저장소 계층에 액세스한다는 것을 알고 있으면 서비스 클래스에서 @Transactional (readonly = true)을 설정할 수 있습니다. 그런 다음 모델에서 변경 작업을 수행하는 메서드에서 @Transactional을 사용하여 비헤이비어를 재정의 할 수 있습니다. 1)과 2) 사이의 성능 문제는 알려져 있지 않습니다.

  2. ==============================

    2.경우에 따라 @Transactional이 모든 개별 메소드에 적용됩니다. 2 @Transactional이 method2 ()에만 적용되고 method1 ()에서는 적용되지 않는 경우,

    경우에 따라 @Transactional이 모든 개별 메소드에 적용됩니다. 2 @Transactional이 method2 ()에만 적용되고 method1 ()에서는 적용되지 않는 경우,

    사례 1 : - method1 () 호출 -> 트랜잭션이 시작됩니다. method1 ()이 method2 ()를 호출 할 때 이미 새로운 트랜잭션이 시작되었으므로

    사례 2 : - method1 () 호출 -> 트랜잭션이 시작되지 않습니다. method1 ()이 method2 ()를 호출하면 새 트랜잭션이 시작되지 않습니다. 왜냐하면 같은 클래스에서 메소드를 호출 할 때 @Transactional이 작동하지 않기 때문입니다. 다른 클래스에서 method2 ()를 호출하면 작동합니다.

    스프링 참조 매뉴얼에서 :

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

    3.여기에서 인용

    여기에서 인용

    이 메커니즘은 프록시를 기반으로하기 때문에 프록시를 통해 들어오는 '외부'메소드 호출 만 가로 챌 수 있습니다. 즉, 대상 객체의 다른 메소드를 호출하는 대상 객체 내의 메소드 인 '자체 호출'은 호출 된 메소드가 @Transactional로 표시 되더라도 런타임시 실제 트랜잭션으로 이어지지 않습니다!

  4. ==============================

    4.다음과 같은 클래스가 있다고 가정합니다.

    다음과 같은 클래스가 있다고 가정합니다.

    @Transactional(readOnly = true)
    public class DefaultFooService implements FooService {
    
      public Foo getFoo(String fooName) {
        // do something
      }
    
      // these settings have precedence for this method
      @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
      public void updateFoo(Foo foo) {
        // do something
      }
    }
    

    클래스 레벨의 @Transactional 어노테이션은 클래스의 모든 메소드에 적용됩니다.

    그러나 메소드에 @Transactional 주석을 달면 (예 : updateFoo (Foo foo)) 클래스 수준에서 정의 된 트랜잭션 설정보다 우선합니다.

    더 많은 정보:

  5. from https://stackoverflow.com/questions/23132822/what-is-the-difference-between-defining-transactional-on-class-vs-method by cc-by-sa and MIT license