[Mybatis 소스 코드 분석 (4)] mybatis 트랜잭션 실현의 원리

Mybatis 관리 업무는 세 가지 방법으로 나뉩니다.

mybatis의 트랜잭션 인터페이스

  1. JdbcTransaction : JDBC 트랜잭션 관리 메커니즘을 사용하여 java.sql.Connection 객체를 사용하여 트랜잭션 커밋을 완료합니다.
  2. ManagedTransaction : 관리 트랜잭션 관리 메커니즘을 사용하여 mybatis 자체는 트랜잭션 관리를 구현하지 않지만 컨테이너 (JBOSS, WebLogic)가 트랜잭션 관리를 실현하도록합니다.
  3. SpringManagedTransaction : Spring의 트랜잭션 관리 메커니즘을 사용하고 @Transaction 주석을 사용하여

Yu는 이제 springboot 기반 프로젝트이므로 SpringManagedTransaction 만 분석합니다.

 

먼저 일부 인터페이스 및 클래스 이해

1. TransactionSynchronization 인터페이스 는 트랜잭션 실행 프로세스의 중요한 지점에서 추가 로직을 실행하기 위해 사용되는 콜백 인터페이스 인 Spring의 트랜잭션 확장 인터페이스입니다.

2, TransactionSynchronizationManager 클래스 : ThreadLocal을 사용하여 현재 트랜잭션의 TransactionSynchronization 컬렉션을 관리합니다.

3. ResourceHolderSynchronization 클래스 : 리소스 (Spring 트랜잭션의 리소스 개념)를 동기화하는 데 사용됩니다. 예를 들어 JDBC의 연결, Hibernate의 세션, JPA의 EntiyManager, kafka의 Producer.

 

의 MyBatis에서 SqlSessionUtil 클래스내부 SqlSessionSynchronization 클래스 상속 TransactionSynchronizationAdapter 어댑터 클래스 (등가 구현 TransactionSynchronization 인터페이스 )


 

거래 실행 프로세스

1. Mybatis 거래 등록 절차

1. SqlSessionTemplate 클래스에서 JDK 동적 프록시 클래스 생성부터 시작합니다. sql을 실행하는 방법에 관계없이이 코드가 결국 사용되기 때문입니다.

2. SqlSessionInterceptor의 invoke 메소드를 직접 살펴 봅니다.

먼저 sqlsession을 획득 한 후 리플렉션을 통해 sqlsession의 특정 메소드를 조정하고, 마지막으로 commit이 커밋되기 전에 특정 조건이 충족되는 것을 알 수 있습니다.

3. getSqlSession 메소드를 입력하십시오.

트랜잭션 동기화 관리자에서 리소스를 가져오고 (sqlSessionHolder는 Sqlsession 만 래핑 함) sessionHolder에서 sqlsesison을 가져옵니다.

sqlsession이 없으면 sessionFacory를 통해 sqlsession을 만든 다음 registerSessionHolder를 실행하여 sessionHolder를 등록합니다.

4. registerSessionHoler 메소드 입력

먼저 Configuration 구성 클래스의 Evironment 환경 클래스에있는 TransactionFactory 트랜잭션 팩토리가 SpringManagedTransactionFactory 또는 해당 하위 클래스인지 확인합니다. (springboot 환경에서 기본값은)

SqlSessionHolder를 래핑 한 다음 리소스를 TransactionSynchronizationManager에 바인딩하고 TransactionSynchronization을 등록합니다.

springboot에서 SqlSessionFactory를 빌드 할 때 트랜잭션 팩토리는 SpringManagedTransactionFactory로 설정됩니다.

5. 마지막으로 TransactionSynchronization은 TransactionSynchronizationManager 클래스의 동기화 정적 속성에 등록됩니다.

 

둘째, 스프링 트랜잭션 동적 프록시 프로세스

springboot 프로젝트에서 왜 @Transaction을 사용하여 서비스 메서드에 주석을 달아 적용합니까? 스프링 바닥층은 어떻게 구현됩니까?

이것은 @EnableTransactionManagement 주석으로 시작됩니다.

1. Springboot 프로젝트의 autoconfig 패키지에 EnableTransactionManagement 주석이 추가되었습니다.

2. EnableTransactionManagement 어노테이션 가져 오기는 Spring 컨테이너가 초기화 될 때 컨테이너로로드되는 TransactionManagementConfigurationSelector 클래스를 추가합니다.

3. TransactionManagementConfigurationSelector 클래스는 ImportSelector 인터페이스를 구현하므로 스프링 컨테이너는이 두 클래스의 반환 값을 컨테이너에 추가합니다.

ProxyTransactionManagementConfiguration 클래스는 주로 BeanFactoryTransactionAttributeSourceAdvisor, TransactionAttributeSource 및 TransactionInterceptor의 세 가지 클래스를 등록하고 구성하는 데 사용됩니다.

4. ImportBeanDefinitionRegistrar 인터페이스를 구현하는 AutoProxyRegistrar 클래스를 계속 살펴보십시오.

그래서 registerBeanDefinitions 메소드를 실행하여 BeanDefinition을 등록합니다.

5. InfrastructureAdvisorAutoProxyCreator 클래스를 등록하는 데 사용되는 registerAutoProxyCreatorIfNecessary 메소드가 있습니다.

Bean을 등록하는 방법은 직접 새로운 RootBeanDefinition 메서드를 사용하고 Spring 컨테이너에 InfrastructureAdvisorAutoProxyCreator 클래스를 삽입하기 때문입니다.

6. InfrastructureAdvisorAutoProxyCreator 클래스는 BeanPostProcessor 인터페이스를 구현합니다.

Bean 초기화 전후에 Bean을 처리하는 데 사용되므로 Bean이 인스턴스화되기 전에 처리를 위해 postProcessBeforeInitialization 메소드가 실행됩니다.

aop 프록시는 원래 Bean이 초기화 된 후 완료되어야하며 프록시 패키지가 원래 Bean에 추가됩니다.

7, wrapIfNecessary 메서드, 필요한 경우 프록시 프록시 만들기

8. createProxy 메서드는 동적 프록시를 만들고 반환하는 데 사용됩니다.

 

셋, 스프링 (mybatis) 트랜잭션 실행 프로세스

1. TransactionInterceptor는 MethodInterceptor 인터페이스를 구현하는 트랜잭션 메소드 인터 셉션 실행기입니다.

2. @Transaction 어노테이션의 메소드가 호출되면이 메소드의 클래스가 aop에 의해 프록시 되었기 때문에 TransactionInterceptor의 invoke 메소드가 실행됩니다.

3. invokeWithTransaction 메소드를 입력하십시오.

TransactionAttribute : 트랜잭션 관련 정보. 어노테이션 유형 트랜잭션과 같은 메소드 획득 클래스에 @Transactional 어노테이션이 있는지 확인하십시오.

PlatformTransactionManager:为거래 관리자

TransactionInfo : 거래 정보. 트랜잭션 관리자 및 트랜잭션 관련 정보를 포함합니다.

progressWithInvocation : 실제 프록시 개체 서비스를 호출하는 메서드

4. 실제 프록시 개체 서비스의 메서드를 호출 한 후 트랜잭션을 커밋하려면 commitTransactionAfterReturning이 필요합니다.

5. 트랜잭션 관리자 클래스의 커밋 방법을 입력합니다.

6. processCommit 메소드 입력

triggerBeforeCommit : TransactionSynchronization 클래스의 beforeCommit 메서드를 트리거하는 데 사용됩니다.

triggerBeforeCompletion : TransactionSynchronization 클래스의 beforeCompletion 메서드를 트리거하는 데 사용됩니다.

doCommit : 스프링 트랜잭션 커밋에 사용

7. 처음에 동기화 속성에 저장된 TransactionSynchronization 구현 클래스를 콜백하려면 TransactionSynchronizationUtils 메소드를 입력하십시오.

예를 들어 mybaits의 시작 부분에 정의 된 SqlSessionSynchronization 클래스

8. mybatisSqlSessionSynchronization 클래스의 beforeCommit 메서드 를 입력 합니다.

sqlSessionHolder에서 sqlSesion을 제거하고 commit 메서드를 실행하여 트랜잭션을 커밋합니다.

완전한

 

추천

출처blog.csdn.net/sumengnan/article/details/114229703