아는 사람 트랜잭션, 트랜잭션 격리 수준 트랜잭션 전파 거동

이 문서에서는 다음과 같은 개념을 소개합니다 : 전송 서비스, 트랜잭션 격리 수준, 봄 업무의 모드. 더러운 읽기 및 팬텀 읽기를 이끌 것 개념을 도입 할 때, 트랜잭션 격리 수준을 원 자성을 이끌 것입니다 거래의 개념을 도입합니다.

사무

거래는 무엇인가?

트랜잭션 데이터베이스의 개념의 시작, 그것은 전체 작업의 통합 시리즈, 동시에 성공하거나 동시에 실패 중 하나에서 작업의 시리즈. 거래의 기본 동작은 다음과 같습니다 :

  1. 열기 업무
  2. 오류가, 롤 다시 발생하면
  3. 오류가 발생하지 않으면 트랜잭션이 최선을 다하고 있습니다

왜 문제가?

우리는 이러한 삽입 데이터와 같은 간단한 작업을 처리 할 때, 두 결과를 얻을 어느 매우 간단 코드 로직에 해당하는 삽입의 성공 또는 실패를 삽입합니다.
우리는 작업이 원자입니다 호출합니다.

그러나 우리의 사업은 단지 데이터를 삽입 한 간단하게 자주하지, 사용자가 버튼을 클릭 수, 우리는 데이터의 조각 및 삭제 데이터를 삽입해야합니다. 각 작업이 시간에, 성공 및 실패 할 가능성이 있기 때문에 우리는 2 ^ 2 = 4 케이스를, 가지고있는 문제까지 프로그램에 따라.

프로그래밍을 용이하게하기 위해 (그리고 실제 비즈니스 로직을 충족하기) 위해, 우리는의,이 두 작업의 원자 것을 제공하는 단일 트랜잭션에서 두 작업, 그래서 훨씬 더 편리한 서비스 처리 트랜잭션 메커니즘의 시작을 소개 .

트랜잭션 격리 수준

우리는 데이터베이스 작업이 트랜잭션에 사용되는 경우에 대해 이야기보다도, 다음 질문은 도입 : 데이터베이스에, 그것은 필연적으로 여러 트랜잭션의 경우는 데이터를 운영 동시에 발생하고 데이터베이스 트랜잭션 격리 수준의 다른 세트가, 다른가있을 것입니다 데이터 조작의 결과는, 고전 더러운 읽기 및 팬텀도 여기에 태어난 읽습니다.

첫 번째 동시 액세스, 다른 트랜잭션 격리 수준에서 팩트 시트를 부여 :

트랜잭션 격리 수준 더러운 읽기 비 반복 읽기 매직 읽기
커밋되지 않은 커밋되지 않은 읽기 읽기
COMMITTED 최선을 다하고 READ 읽기 하지 않음
반복 읽기 반복 읽기 하지 않음 하지 않음
직렬화 직렬화 하지 않음 하지 않음 하지 않음

트랜잭션 격리 레벨을 알 수있는 높은는 문제 적은 있지만, 대응하는 성능 저하는, 다음과 같은 문제가 다른 트랜잭션 격리 레벨있어서 몇 가지 예를 설정 :

확약 읽기

트랜잭션이 커밋되지 않은 격리를 읽기 전용으로 설정하면, 문제는 더러운 읽기에 가장 경향이있다. 현재 트랜잭션이 다른 트랜잭션에서 커밋되지 않은 데이터를 읽을 수있는 커밋되지 않은 수단을 읽기 : 라이브에 재생 그의 아들로 아버지를 가정하지만, 한 실수로 월 2,000 진전이 공격보다 1000 이상 3000, 그의 아들로 전환 상점 소비, 잔액 조회 그는 3,000 개 이상. 트랜잭션의 아버지가 제출하지 않은 것처럼, 즉시 2,000 생활비 과거 거래, 다시 싸움을 롤백.

균형은 아들이 더러운 데이터를 읽을입니다 이번에는 원인은 데이터를 다른 커밋되지 않은 트랜잭션을 읽는 것입니다.

READ COMMITTED

한 트랜잭션 격리 수준이 위의 문제를 해결할 수 COMMITTED 더러운 읽기를 읽기 전용으로 설정되어, 그는 현재의 트랜잭션 데이터 만 제출 된 기타 사항을 읽을 수 있도록 할 수 있습니다. 비 반복 읽기 : 그러나 새로운 문제에 직면하게 될 것이다 제출 읽기.

예를 들어, 그의 아들 시간 (현재의 트랜잭션 (transaction)를 엽니 다), 시스템은 카드가 500 위안 감지를 위해 상점 소비, 지불에 카드를했다. 그의 아들이 공제를 준비하고 2,500 위안 균형 검색을 확인할 때 그의 아들이 시간 아버지 (이 쿼리는 아버지의 전송 트랜잭션 커밋 이후에 발생), 생활의 2,000 비용을 돌려

동일한 트랜잭션에서 다른 시간에 읽을 아들의 균형 값이없는 비 반복 읽기에 문제가있는 동일합니다. 이 문제를 해결하기 위해 원하는 트랜잭션 격리 수준이 반복 읽기로 설정

반복 읽기

반복 읽기의 경우, 현재 트랜잭션 데이터가이 방법에 운영하고 업데이트하는 다른 거래를 금지하고, 전송 트랜잭션의 아버지는 문제를 해결에서 계정 공제, 비 반복 읽기 후 그의 아들이 끝날 때까지 기다립니다.

다음과 같이 그러나 다음 단계 반복 읽기 문제라고도 팬텀을 발생할 수 있습니다 예를 들어, 읽기 : 오늘 밖으로 아들 1,000 위안 소비, 아버지가 아들 일일 소비 기록 (열려있는 트랜잭션)을 발견 보려면 그 1천위안의 총. 이번에는 그의 아들 1,000 위안 (거래의 아버지가 아직 진행)의 소비는 다음 오늘날의 소비자 레코드의 아버지의 아들을 인쇄하고 어떻게 든 더 많은 소비자 기록보다는 2,000위안로 설정되어 있음을 발견했다.

현재의 트랜잭션 데이터 작업 갑자기 증가 이하의 경우로 이어지는 데이터 기타 사항의 추가 또는 삭제로 인해 작업의 과정에서이 같은 현재의 트랜잭션,라는 팬텀 읽습니다. 우리는 팬텀 읽기, 트랜잭션 격리 수준 직렬화를 업그레이드 할 필요를 해결하려면

직렬화

소비자 기록, 그의 아들이 소비되지 않을 때 날을 볼 수있는 아버지 : 트랜잭션 격리 수준 직렬화되면 모든 거래는 위의 예에 해당하는 직렬로 실행됩니다. 이 방법은 문제가 트랜잭션 동시성,하지만 비효율적을 가지고 해결할 수 있습니다.

전파

일반적으로 사용되는 데이터베이스 Orcale 기본 트랜잭션 격리 수준에서 최선을 다하고, 그리고 MySQL의 기본은 반복 읽기 읽기된다. 트랜잭션 격리 수준이 반복 읽기가 있지만 MySQL의 InnoDB의 엔진에서, 팬텀이 문제를 해결할 수도 읽을 수 있지만,이 뒤에 원리는 데이터의 삽입과 삭제를 방지하기 위해, 데이터 라인 사이에 잠금 간격을 추가하는 것입니다.

어떤 종류의 트랜잭션 격리 수준의 구체적인 선택은 특정 비즈니스 요구에 따라 달라집니다

트랜잭션 전파 거동

트랜잭션의 전파는 문자 그대로의 아주 좋은 이해도 : 발생하는 전파 할 희망은 두 개 이상의 개체가 필요하고, 여기 트랜잭션에서 수행되어야하는 두 가지 방법을 의미한다, A는 경우 트랜잭션 다른 메소드를 호출 거래 방법 B, 실행하는 방법을 다른 트랜잭션 방식 B.

봄 (어떻게 업무 방법 B를 실행하는) 트랜잭션 전파 거동 7 종류를 정의하고있다 :

전파 거동 의미
PROPAGATION_REQUIRED 이미이 거래에 추가 트랜잭션 (가장 일반적인 선택이지만, 또한 봄 업무의 기본 동작의 확산)이있는 경우에는 트랜잭션, 새로운 트랜잭션을 생성하지 않는 경우
PROPAGATION_SUPPORTS 어떤 트랜잭션이 비 트랜잭션 방식으로 실행되지 않을 경우, 현재의 트랜잭션 (transaction)를 지원
PROPAGATION_MANDATORY 어떤 트랜잭션, 예외를 throw하지 않는 경우, 현재의 트랜잭션 (transaction)를 사용하여
PROPAGATION_REQUIRES_NEW 새로운 트랜잭션, 현재의 트랜잭션 (transaction)가 존재하는 경우, 현재 거래 정지
PROPAGATION_NOT_SUPPORTED 작업을 수행하는 방법 비 트랜잭션, 현재의 트랜잭션 (transaction)가 존재하는 경우, 보류 현재의 트랜잭션 (transaction)를 넣어
PROPAGATION_NEVER 현재의 트랜잭션 (transaction)가 존재하는 경우 비 트랜잭션 방식으로 수행, 예외가 발생합니다
PROPAGATION_NESTED 현재의 트랜잭션 (transaction)가 존재하는 경우, 중첩 된 트랜잭션 내에서 실행됩니다. 어떤 트랜잭션이 유사한 작업을 수행하지 않으면 PROPAGATION_REQUIRED

일반적으로 가장 많이 사용되는 우리는 업무의 기본 전파 행동의 스프링 PROPAGATION_REQUIRED는, 합리적 다른 트랜잭션 전파 행동의 유도를 이해할 수있다.

예를 들어, 우리는 현재 다음과 같은 코드가 있습니다 :

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
     methodB();
    // do something
}
 
@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
    // do something
}
  1. 그는 새로운 사업을 만들어, 그래서 우리가 때문이 아니라 현재의 트랜잭션 (transaction)의, methodA을 수행하자.
  2. methodB이 될 수 문제의 methodA에 직접 추가 새 트랜잭션을 생성 할 필요가 없습니다 있도록 methodA 이미 트랜잭션에 존재하기 때문에, methodA에서 methodB를 호출 할 때.

개요

  1. 거래는 다른 일련의 조작은 원자 할 수 있습니다. (물론, 트랜잭션이 네 가지 ACID 속성을 포함하고, 강조는 여기에서 원자의 초기 도입에)
  2. 트랜잭션 격리 수준은 트랜잭션이 동시 작업에 대한 액세스 규칙을 정의합니다.
  3. 트랜잭션 전파 동작은 트랜잭션을 사용하는 방법을 방법의 구현에 트랜잭션을 정의합니다.

참고 기사 :
트랜잭션 격리 수준 : HTTPS : //www.cnblogs.com/ubuntu1/p/8999403.html
트랜잭션 전달 동작 : HTTPS : //blog.csdn.net/weixin_39625809/article/details/80707695
거래의 전파 : HTTPS : //www.cnblogs.com/softidea/p/5962612.html

추천

출처www.cnblogs.com/tanshaoshenghao/p/12184454.html