간단한 용어에서 당신과 함께 봄 기사 업무의 원칙

기본 원리 봄 업무

봄은 사실 트랜잭션에 대한 트랜잭션 데이터베이스 지원의 성격이며, 어떤 트랜잭션 데이터베이스 지원, 스프링 트랜잭션 기능을 제공 할 수 없습니다 않습니다. 순수 JDBC 데이터베이스 작업을 위해, 당신이 서비스를 사용하려면 다음 단계를 수행 할 수 있습니다 :

  1. ) (접속 연결 사기꾼 = DriverManager.getConnection를 얻기
  2. 열기 거래 con.setAutoCommit (참 / 거짓);
  3. CRUD 수행
  4. ) (/) (con.rollback를 트랜잭션 / 롤백 트랜잭션 con.commit 커밋;
  5. () 연결 conn.Close을 닫습니다;

Spring의 트랜잭션 관리 기능을 사용한 후, 우리는 더 이상 단계 2와 4의 코드를 쓸 수 있지만, Spirng에 의해 자동으로 이루어집니다. 어떻게 세션 그것의 우리가 쓰기 전에 거래 후 열기와 CRUD와 닫는 봄? 이 문제를 해결하기 위해, 전체를 달성하기 위해 Spring의 트랜잭션 관리 원칙을 이해할 수있다. 다음에서 간단히 실시 예 주석 도입

  1. 식별 주석 @Transactional 관련 클래스와 메소드에, 구성 파일의 주석 드라이브를 엽니 다.
  2. 그것은 중요한 빈을 생성 파싱하기 시작 스프링 때, 이번에는 메모 관련된 클래스 및 메소드를 볼 수 있고, 이에 따라 분사 @Transaction 기반으로 이러한 클래스 및 메소드 및 구성 파라미터에 대한 프록시 에이전트를 생성 우리는 관련 문제를 처리하기 위해 (트랜잭션을 커밋 열린 정상, 트랜잭션이 비정상적으로 롤백됩니다).
  3. 실제 트랜잭션 커밋 및 롤백 데이터베이스 계층은 바이너리 로그를 통해 달성 또는 리두 로그.

Spring의 트랜잭션 메커니즘

모든 데이터 액세스 기술은 트랜잭션이 데이터 조작, 데이터의 완료에 최선을 다하고 있습니다 또는 오류가 발생했을 때 롤백, 트랜잭션 처리, 이러한 기술 거래를 활성화하는 API를 제공합니다.

통합 메커니즘 스프링의 트랜잭션 메커니즘은 트랜잭션 처리 다른 데이터 액세스 기술을 처리합니다. 표에 나타낸 바와 같이 스프링의 트랜잭션기구는 PlatformTransactionManager의 인터페이스, 다른 데이터 액세스 기술 인터페이스를 사용하여 다른 거래를 제공한다.

데이터 액세스 기술 및 구현

 

 

다음 코드는 프로그램에서 트랜잭션 매니저를 정의한다 :

@Bean 
 공공 의 PlatformTransactionManager의 transactionManager () {

    JpaTransactionManager의 transactionManager = 새로운 JpaTransactionManager ();
    transactionManager.setDataSource (는 dataSource ()); 
    반환 의 transactionManager를;
}

 

명예 거래

트랜잭션 지원, 사용자가 방법을 선택할 수 있습니다 봄 명성 방법에 @Transactional 주석을 사용하여 주석을 사용하여 트랜잭션의 사용이 방법은 트랜잭션 지원이 필요하다는 표시가 필요합니다. 이것은 AOP 기반의 작업의 실현이다.

@Transactional 
 공공  무효 saveSomething (ID 롱, 문자열 이름) { 
     // 데이터베이스 작업 
}

 

여기서 특히 주목할입니다 org.springframework.transaction.annotation 패키지 대신 javax.transaction의에서이 @Transactional 주석.

AOP 프록시 구현의 두 종류 :

  • JDK는,이 차단되지 에이전트 인터페이스는 전용 메소드는 인터페이스에 존재하지 않아야이고;
  • CGLIB는 서브 클래스, 개인 방법은 여전히 ​​서브 클래스에 표시되지 않습니다, 그것은 가로 챌 수 없습니다.

자바 동적 프록시.

특히 네 단계를 수행 :

  1. 자신의 통화 프로세서를 만들 수있는 인터페이스를 구현하여 InvocationHandler입니다;
  2. 인터페이스 객체 및 프록시 클래스로 클래스 로더의 세트를 지정하여 동적 프록시 클래스를 생성하는 단계;
  3. 동적 프록시 클래스 생성자가 반사함으로써 얻어지는 유일한 파라미터 타입은 호 프로세서 인터페이스 타입이고;
  4. 핸들러를 호출하도록 구성된 동적 프록시 클래스 인스턴스 생성자 객체를 생성하여 파라미터로서 전달된다.

GCLIB 에이전트

CGLIB (코드 생성 라이브러리) 강력한 고성능, 고품질의 코드 생성 라이브러리입니다. 그것은 런타임 Java 클래스에서 확장 및 Java 인터페이스를 구현 할 수 있습니다.

  • CGLIB 동적 런타임에 새로운 클래스 (하위 클래스)를 생성, ASM을 캡슐화합니다.
  • AOP에 대한 CGLIB는, 프록시 기반으로해야합니다 인터페이스를 JDK, CGLIB는 이러한 제한이 없습니다.

구별의 원칙 :

처리하는 구체적인 방법을 호출하기 전에 인터페이스 호출의 InvokeHandler 구현 익명 프록시 클래스를 생성하기 위해 반사를 이용하여 자바 동적 프록시. 오픈 소스 패키지, 클래스 파일 프록시 객체 클래스의로드를 사용하여 동적 프록시 CGLIB의 ASM은 서브 바이트 코드를 수정하여 처리된다.

  1. 대상 객체가 인터페이스를 구현하는 경우, JDK 동적 프록시 AOP 구현의 기본을 사용합니다
  2. 대상 객체가 인터페이스를 구현하는 경우, 당신은 AOP를 달성 CGLIB의 사용을 강제 할 수
  3. 인터페이스를 구현하지 않는 대상 객체가 CGLIB 라이브러리를 사용해야 할 경우, 스프링이 자동으로 JDK 동적 프록시 사이 CGLIB를 변환합니다

클래스는 기관 내부에 갈 수있는 직접적인 방법, 프록시의 자체 인스턴스를 유지함으로써이 시간이 아닌 경우.

@Service
 공공  클래스 PersonServiceImpl는 구현 PersonService을 {
    @Autowired
    PersonRepository personRepository;

    // 적용되지 않습니다 전송 방법 안쪽이 클래스의 트랜잭션을 호출, 자신의 프록시 개체를 삽입 
    @Autowired
    PersonService selfProxyPersonService;

    / **
     * 통과 시험 업무
     *
     * @param의 사람
     * @return 
     * /
    @Transactional
    공공 (사람 사람) 저장 사람 {
        P는 Person = personRepository.save (사람)
         은 try {
             // 새롭게 문을 연 독립적 인 트랜잭션 롤백 
            selfProxyPersonService.delete ();
        } 캐치 (예외 전자) {
            e.printStackTrace ();
        }
        은 try {
             // 현재 트랜잭션이 롤백 
            selfProxyPersonService.save2 (사람);
        } 캐치 (예외 전자) {
            e.printStackTrace ();
        }
        personRepository.save (사람);

        반환 P는;
    }

    @Transactional
    공공  무효 저장 2 (사람 사람) {
        personRepository.save (사람);
        던져  새로운 ) (RuntimeException을을;
    }

    @Transactional (전파 = Propagation.REQUIRES_NEW)
     공공  무효가 (삭제) {
        personRepository.delete ( 1L );
        던져  새로운 ) (RuntimeException을을;
    }
}

 

Spring 트랜잭션 전파 특성

여러 개의 동시 트랜잭션이 때 소위 스프링 부동산 거래의 확산이 정의, 봄은 이러한 문제의 행동에 대처하는 방법이어야한다. 이러한 속성은 TransactionDefinition 특정 상수는 아래 표에 설명 정의 :

 

 

데이터베이스 격리 수준

 

 

더러운 읽기 : 트랜잭션 데이터가 추가 및 삭제했지만, 다른 트랜잭션이 커밋되지 않은 데이터를 읽을 수 제출하지 않았다. 첫 번째 트랜잭션이 롤백되면이 때, 다음 두 번째 트랜잭션은 더티 데이터에 참석.

반복 불가능한 읽기 두가 제 1 판독 동작 및 제 2 동작, 또한 수정 트랜잭션 데이터는 두 데이터가 일치하지 않는 판독이 시간 사이에 거래의 판독 동작왔다.

매직 읽기 : 첫 번째 트랜잭션이 새로운 데이터를 수정할 때 대량 편집 할 데이터의 범위에 대한 첫 번째 트랜잭션이이 범위에 두 번째 트랜잭션 데이터를 추가, 그것은 손실됩니다.

요약 :

높은 격리 수준은, 더 많은 우리는 데이터의 무결성과 일관성을 보장 할 수 있지만, 동시 성능에 미치는 영향도 크다.

데이터베이스의 기본 격리 수준의 대부분은 SQLSERVER, 오라클 등 최선을 다하고을 읽고있다

몇몇 데이터베이스의 기본 격리 수준 : 반복 읽기 예 : MySQL의 InnoDB의

봄 격리 수준

 

 

중첩 된 트랜잭션

위의 침구의 이론적 지식, 우리는 대략 속성과 데이터베이스 트랜잭션 봄 업무의 특성 중 일부를 알고, 우리는 메커니즘 스프링 트랜잭션 전파에 대한 심층 이해, 현장에서 중첩 된 트랜잭션의 일부를 분석 할 수 있습니다.

) (내부 방식 B의 서비스 B를 호출) (외부 트랜잭션 서비스를하는 방법으로서 가정

PROPAGATION_REQUIRED (스프링 默认)

ServiceB.methodB () 수준이 트랜잭션 PROPAGATION_REQUIRED로 정의되면, ServiceA.methodA를 실행 () 스프링 트랜잭션을 재생할 때, 다음 호출 ServiceB.methodB (), ServiceB.methodB는 ()가 ServiceA를 실행했는지 확인합니다. 내부 methodA () 트랜잭션은 새로운 트랜잭션이 갱신되지 않습니다.

시간 ServiceB.methodB ()가 자신이없는 트랜잭션에서 실행 발견하면, 그는 자신을 위해 트랜잭션을 할당됩니다.

따라서, ServiceA.methodA에서 특이한 () 또는 어떤 장소에 ServiceB.methodB (에), 트랜잭션이 롤백됩니다.

PROPAGATION_REQUIRES_NEW

예를 들어, 우리는 트랜잭션 레벨 ServiceA.methodA () 트랜잭션 수준 PROPAGATION_REQUIRED, ServiceB.methodB ()를 설계 PROPAGATION_REQUIRES_NEW이다.

그 다음이 중단됩니다 ServiceB.methodB (), 트랜잭션 ServiceA.methodA (), (ServiceB.methodB에 실행) 거래 완료 후 ServiceB.methodB ()을 기다리고, 새로운 트랜잭션을 재생할 때, 그것은이었다 계속합니다.

그와 PROPAGATION_REQUIRED 업무 차이가 롤백 트랜잭션의 범위가. ServiceB.methodB 때문에 ()는 서로 다른 두 가지 문제가있다, 그래서 새 트랜잭션을 시작합니다. ServiceB.methodB ()가 제출 된 경우, ServiceA.methodA () 롤백, ServiceB.methodB () 롤백되지 않습니다 실패했습니다. ServiceB.methodB는 (), 롤백 그가 () ServiceA.methodA, ServiceA.methodA을 (캡처) 트랜잭션이 아직 제출 될 수있는 경우는 예외를 throw하지 못한 경우 (B 주요 예외가 발생보고되지 않은 예외를 롤백합니다) .

PROPAGATION_SUPPORTS

ServiceB.methodB () 트랜잭션 레벨 PROPAGATION_SUPPORTS 가정 할 때 다음 ServiceB.methodB ()의 구현의 경우) (ServiceA.methodA가 발견되면 ServiceA.methodA ()는, 현재의 트랜잭션을 추가 트랜잭션을 열었다 찾지 열려있는 트랜잭션, 그것은 개방 문제가 아닙니다. 이번에는 내부 문제는 가장 바깥 쪽 거래에 전적으로 의존한다.

PROPAGATION_NESTED

지금은 상황이 더 복잡하게, ServiceB.methodB ()는 트랜잭션 속성이 PROPAGATION_NESTED로 구성되어, 어떻게 둘 사이의이 시간 협력을 켭니다 그것? ServiceB # methodB하면 롤백 한 후 내부 문제 (예 : ServiceB # methodB) 그것은 실행 저장 점 및 외부 업무 (즉 ServiceA # methodA는) 다음과 같은 두 가지 방법이있을 수 전에 롤백합니다 :

A,, 비정상 분기 논리를 비정상적인 캡처

보이드 methodA () {

        시도 {

            ServiceB.methodB (); 

        } 캐치 (SomeException) {

            // ) (예 ServiceC.methodC 같은 다른 서비스를 수행하는;

        } 

    }

이러한 방식 ServiceB.methodB이 실패하면 실행 전에 다음 저장 점 ServiceB.methodB 롤백 한 ServiceC.methodC ()를 실행하는 분기 실행 효과를 연주 중첩 트랜잭션의 또한 가장 중요한 부품이므로에서 PROPAGATION_REQUIRED와 PROPAGATION_REQUIRES_NEW 그것을 할 방법이 없습니다 동안 더 더티 데이터 (이 방법에 해당이 실행되지 않습니다),이 기능은 몇 가지 특별한 서비스를 사용할 수 없습니다.

B, 외부 트랜잭션 롤백 / 그것을 실행하기 전에, 다음 (어떤 경우에 그렇게 될 것입니다) 첫 ServiceB.methodB 저장 점으로 롤백 총무 (ServiceB # methodB) 롤백 그래서 만약 (외부 업무, 변경하지 않고 코드를 커밋 자신의 특정 구성에 따라 결정할 것이다 ServiceA 번호 methodA는) 커밋 또는 롤백입니다

분석하지 않습니다 기본 트랜잭션 전파 특성보다 다른 세 이하.

개요

프로젝트가 거래 장소를 사용할 필요를 위해, 나는 개발자는 여전히 우리가 주석을 사용해야하는 경우 맹목적으로, 봄의 업무 노트를 사용하지 않는 트랜잭션을 구현의 : TransactionCallback 인터페이스의 스프링을 사용하는 것이 좋습니다, 그것은 스프링 담당 전파 메커니즘과 격리 수준이 있어야합니다 상세한 이해, 결과가 발생할 수 있습니다 매우 예기치 않은 것입니다.

거래에 봄 부팅 지원

org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration 클래스. 우리는 봄 부팅이 자동으로 봄 업무에 대한 주석 지원을 열어 볼 수 있습니다

읽기 전용 트랜잭션 개념 (@Transactional (읽기 전용 = TRUE))의

  • 개념 :

이 과정 트랜잭션의 끝에 시작 (시점 A)를 설정하는이 시점에서, 다른 기업이 제출 한 데이터는 트랜잭션이 표시되지 않습니다! (제출이 표시되지 않는 시간이 지나면 다른 사람에게 쿼리 데이터).

@Transcational (읽기 전용 = TRUE)이 주석은 일반적으로 비즈니스 클래스로 작성, 또는 그 문제가 추가 제어의 방법에 대한 것입니다. 당신 읽기 전용 = true를 괄호 안에 추가 할 때, 기본 데이터 소스를 말할 것이다,이 JDBC에 대한 읽기 전용 트랜잭션입니다, 읽기 전용 트랜잭션은 어떤 속도 최적화가있을 것입니다. 그리고 쓰기, 다른 구성 트랜잭션 제어 트랜잭션이 필요한 기본 데이터 소스, 전파 행위 (전파)의 격리 수준 뒤에 기본 값을 DEFAULT로 트랜잭션 격리 수준 (격리), 그래서 여전히있을 것이다 트랜잭션, 코드 생성에 던져 RuntimeException의 존재, 여전히 트랜잭션이 롤백하도록합니다.

  • 응용 프로그램 :
  1. 단일 쿼리를 실행할 경우, 트랜잭션 지원을 활성화 할 필요가 없습니다, SQL 기본에 대한 데이터베이스 지원은 실행시 읽기 일관성;
  2. 한 번 같은이 시나리오의 통계 쿼리, 보고서, 쿼리, 여러 쿼리를 실행하면 SQL 쿼리의 수는 달리, 이전 SQL 쿼리 후, 제의 SQL 쿼리 데이터가되기 전에, 읽기의 전체적인 일관성을 확인해야합니다 다른 사용자의 변경, 종합 통계 쿼리 일치하지 않는 상태 데이터 읽기는 트랜잭션 지원을 활성화해야한다,이 때 나타납니다.

[데이터의 전체적인 일관성을 보장하기 위해, 소정의 통계 정보를, 이번에 다수의 쿼리를 수행 참고 읽기 전용 트랜잭션을 사용]

이 주 당신이 추천 점에 나를 도울 수, 당신을 도울 생각한다면 내 읽어 주셔서 감사, 긴 숨이. 결함은 또한 환영되어있다.

또는 당신은 내 공개 번호 [에 초점을 맞출 수 있습니다 자바 기술 관치 ], 당신과 함께 가끔 건조 기술 콘텐츠 공유 매력의 아키텍처를 재정의!

참조 : 

http://www.codeceo.com/article/spring-transactions.html 

http://www.cnblogs.com/fenglie/articles/4097759.html

https://www.zhihu.com/question/39074428/answer/88581202

http://blog.csdn.net/andyzhaojianhui/article/details/51984157

추천

출처www.cnblogs.com/lfs2640666960/p/11708130.html