@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
'programing' 카테고리의 다른 글
| "Unused variable x" 경고를 억제하는 가장 좋은 방법은 무엇입니까? (0) | 2022.11.13 |
|---|---|
| SQL을 INSERT IN...과(와) 함께 사용할 때 오류 1064가 발생합니다.선택...중복 키 업데이트 시 (0) | 2022.11.13 |
| Apache는 php 파일을 표시하는 대신 다운로드하고 있습니다. (0) | 2022.11.13 |
| MySQL은 두 열을 하나의 열에 결합합니다. (0) | 2022.11.13 |
| 5일 전 날짜는 어떻게 알 수 있죠? (0) | 2022.11.13 |