programing

@Transactional on class와 메서드의 차이점은 무엇입니까?

sourcejob 2022. 11. 13. 19:30
반응형

@Transactional on class와 메서드의 차이점은 무엇입니까?

케이스 1

@Transactional
public class UserServiceImpl implements UserService {

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

        }
    }
    public void method2(){

    }
}

케이스 2

public class UserServiceImpl implements UserService {

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

        }
    }
    @Transactional
    public void method2(){

    }
}

예외 발생 시 1은 롤백이 동작하지만 2는 동작하지 않습니다.케이스1에 따라 퍼포먼스에 문제가 있습니까?

1 @Transactional이 모든 공개 개인방식에 적용되는 경우.Private 메서드와 Protected 메서드는 스프링에 의해 무시됩니다.

Spring은 @Transactional에서 주석을 달지 않은 이 클래스의 모든 공개 메서드에 클래스 레벨 주석을 적용합니다.그러나 주석을 개인 또는 보호된 메서드에 배치하면 Spring에서 오류 없이 무시합니다.

2 @Transactional이 method1()이 아닌 method2()에만 적용되는 경우

케이스 1: - 메서드1() -> 트랜잭션이 시작됩니다.method1()이 method2()를 호출하면 새로운 트랜잭션이 이미 존재하기 때문에 새로운 트랜잭션은 시작되지 않습니다.

케이스 2: - 메서드1() ->을 호출하고 트랜잭션은 시작되지 않습니다.method1()이 method2()를 호출하면 새로운 트랜잭션이 시작되지 않습니다.이는 같은 클래스 내에서 메서드를 호출할 때 @Transactional이 작동하지 않기 때문입니다.다른 클래스에서 method2()를 호출하면 동작합니다.

스프링 참조 설명서:

프록시 모드(디폴트)에서는, 프록시를 개입시켜 착신하는 외부 방식 콜만이 대행 수신됩니다.즉, 실제로 타깃오브젝트 내의 메서드가 타깃오브젝트의 다른 메서드를 호출해도 호출된 메서드가 @Transactional로 마크되어 있어도 실행 시 실제 트랜잭션이 발생하지 않습니다.또한 프록시는 예상되는 동작을 제공하기 위해 완전히 초기화되어야 합니다.따라서 초기화 코드에서 이 기능(@PostConstruct)에 의존하지 마십시오.

@Transactionalon class는 서비스의 각 메서드에 적용됩니다.지름길입니다.통상, 다음과 같이 설정할 수 있습니다.@Transactional(readOnly = true)모든 메서드가 저장소 계층에 액세스한다는 것을 알고 있는 경우 서비스 클래스로 이동합니다.다음으로 동작을 덮어쓸 수 있습니다.@Transactional모델을 변경하는 방법에 대해 설명합니다.1)과 2) 사이의 성능 문제는 알 수 없습니다.

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

@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) 레벨에서 설정보다 이것은 클래스레벨에서 정의된 트랜잭션 설정보다 우선합니다.

상세 정보:

여기서 인용하다

Spring 팀은 인터페이스에 주석을 다는 것이 아니라 @Transactional 주석을 사용하여 구체적인 클래스에 주석을 다는 것을 권장합니다.

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

언급URL : https://stackoverflow.com/questions/23132822/what-is-the-difference-between-defining-transactional-on-class-vs-method

반응형