Spring의 트랜잭션 마법 공개
@Transactional을 사용하여 메소드에 주석을 추가하면 Spring이 프록시 클래스를 생성하여 들어오는 메소드 호출을 차단합니다. 작동 방식은 다음과 같습니다.
프록시 클래스 생성 및 구조
Spring은 주석이 달린 클래스와 동일한 인터페이스를 구현하는 프록시 클래스를 생성합니다. 프록시 클래스는 원래 클래스를 래핑하는 동적으로 생성된 클래스입니다. 프록시 클래스 내에서 Spring은 트랜잭션의 라이프사이클 관리와 같은 트랜잭션 동작을 처리하는 코드를 삽입합니다.
원본 클래스의 실제 인스턴스는 영향을 받지 않습니다. 그대로 유지되지만 원래 클래스에 대한 메서드 호출은 프록시 클래스에 의해 차단됩니다.
프록시 클래스의 가시성
프록시 클래스는 일반적으로 런타임에 표시되지 않습니다. Spring은 프록시를 통해 메소드 호출을 투명하게 가로채서 마치 원래 클래스가 호출되는 것처럼 보이게 합니다. 그러나 디버깅 도구나 AOP 프레임워크와 같은 도구를 사용하여 프록시 클래스에 액세스할 수 있습니다.
내부 호출에 대한 제한된 트랜잭션 범위
Spring의 트랜잭션 프록시는 외부 소스. 동일한 개체 내에서 이루어진 호출("자체 호출"이라고도 함)은 차단되지 않습니다. 이는 이러한 호출이 프록시 메커니즘을 우회하기 때문입니다.
자체 호출 해결 방법
자체 호출 방법에 대한 트랜잭션 동작을 활성화하려면 프록시 인스턴스를 삽입할 수 있습니다. BeanFactoryPostProcessor를 사용하여 자체 참조 클래스에 클래스를 추가합니다. 이를 통해 프록시를 통해 내부 호출을 지시할 수 있으므로 트랜잭션 범위가 자체 호출 방법으로 확장됩니다.
위 내용은 Spring의 @Transactional 주석은 어떻게 트랜잭션을 관리하고 자체 호출을 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!