[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.@ 클래스에 대한 트랜잭션은 서비스의 각 메소드에 적용됩니다. 그것은 바로 가기입니다. 일반적으로 모든 메소드가 저장소 계층에 액세스한다는 것을 알고 있으면 서비스 클래스에서 @Transactional (readonly = true)을 설정할 수 있습니다. 그런 다음 모델에서 변경 작업을 수행하는 메서드에서 @Transactional을 사용하여 비헤이비어를 재정의 할 수 있습니다. 1)과 2) 사이의 성능 문제는 알려져 있지 않습니다.
@ 클래스에 대한 트랜잭션은 서비스의 각 메소드에 적용됩니다. 그것은 바로 가기입니다. 일반적으로 모든 메소드가 저장소 계층에 액세스한다는 것을 알고 있으면 서비스 클래스에서 @Transactional (readonly = true)을 설정할 수 있습니다. 그런 다음 모델에서 변경 작업을 수행하는 메서드에서 @Transactional을 사용하여 비헤이비어를 재정의 할 수 있습니다. 1)과 2) 사이의 성능 문제는 알려져 있지 않습니다.
-
==============================
2.경우에 따라 @Transactional이 모든 개별 메소드에 적용됩니다. 2 @Transactional이 method2 ()에만 적용되고 method1 ()에서는 적용되지 않는 경우,
경우에 따라 @Transactional이 모든 개별 메소드에 적용됩니다. 2 @Transactional이 method2 ()에만 적용되고 method1 ()에서는 적용되지 않는 경우,
사례 1 : - method1 () 호출 -> 트랜잭션이 시작됩니다. method1 ()이 method2 ()를 호출 할 때 이미 새로운 트랜잭션이 시작되었으므로
사례 2 : - method1 () 호출 -> 트랜잭션이 시작되지 않습니다. method1 ()이 method2 ()를 호출하면 새 트랜잭션이 시작되지 않습니다. 왜냐하면 같은 클래스에서 메소드를 호출 할 때 @Transactional이 작동하지 않기 때문입니다. 다른 클래스에서 method2 ()를 호출하면 작동합니다.
스프링 참조 매뉴얼에서 :
-
==============================
3.여기에서 인용
여기에서 인용
이 메커니즘은 프록시를 기반으로하기 때문에 프록시를 통해 들어오는 '외부'메소드 호출 만 가로 챌 수 있습니다. 즉, 대상 객체의 다른 메소드를 호출하는 대상 객체 내의 메소드 인 '자체 호출'은 호출 된 메소드가 @Transactional로 표시 되더라도 런타임시 실제 트랜잭션으로 이어지지 않습니다!
-
==============================
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)) 클래스 수준에서 정의 된 트랜잭션 설정보다 우선합니다.
더 많은 정보:
from https://stackoverflow.com/questions/23132822/what-is-the-difference-between-defining-transactional-on-class-vs-method by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 커맨드 라인 인자와 스프링 다루기 (0) | 2019.01.27 |
---|---|
[SPRING] Spring JDBC 연결 풀 모범 사례 (0) | 2019.01.27 |
[SPRING] Lombok @Builder 및 JPA 기본 생성자 (0) | 2019.01.27 |
[SPRING] lazy-init에 대한 Spring 기본 동작 (0) | 2019.01.27 |
[SPRING] 스프링 보안 3.1을 사용하여 활성 디렉토리에 인증 될 때 역할 처리 (0) | 2019.01.27 |