MySQL의 트랜잭션 격리 수준을 파악하기

첫째, 테이블 계정을 만듭니다. 테이블이 이동 만드는 과정 (InnoDB 스토리지 엔진은 트랜잭션을 지원하기 때문에 테이블 기억 엔진 이노로 설정되어 있으므로) . 다음과 같이 구성 테이블은 다음과 같습니다

 

그런 다음 결과를 넣은 후, 두 테이블에 데이터를 삽입 :

 

문제를 설명하기 위해, 우리는 (시간, 오른쪽 사용자 A와 사용자 B로 되) 두 명의 사용자를 시뮬레이션하고, 현재의 MySQL 세션의 트랜잭션 격리 수준을 설정하려면 로그인이 콘솔이 열려 있습니다.

A. 읽기 커밋 (커밋되지 않은 읽기)

 특정 사용자 A는 다음과 같이 작동 :

설정 세션 트랜잭션 격리 수준이 커밋되지 않은 읽기, 
트랜잭션을 시작; 
선택 
 * 
에서 
 계정을;

결과는 다음과 같다 :

  

 

사용자 B의 동작은 다음과 같습니다 :

커밋되지 않은 읽기 세션 트랜잭션 격리 수준을 설정; 
트랜잭션을 시작; 
계정 업데이트 
설정 
 계정 계정 + = 
200 
여기서, 
 ID = 
1 
;

 그리고 우리는 다음과 같은 결과를 사용자의 데이터를 조회 :

 

 

결론

트랜잭션이 커밋하지 않은 경우에도 우리는 트랜잭션 격리 수준이 커밋되지 않은 읽기 하겠지만, 우리는 여전히 분리의 모든 종류의 가장 낮은 수준 인 커밋되지 않은 데이터를 읽을 수 있습니다

그래서 당신은 질문이 있습니까?

우리는 부담없이 아주 골칫거리 트랜잭션 다른 커밋되지 않은 트랜잭션에서 데이터를 읽을 수있는, 우리라는 더러운 읽기 . 나는 이름이 우리가 생각할 수있는 인상을 강화하기 위해 재생 방법을 모른다,이 거래는, 아무도, 정말 더러운, 바하을 기다릴 수 없어 제출하지 않았다 심지어 것들 배고픈 좋은 경박 한 아입니다!

사실, 우리의 데이터가 변경?

대답은 '아니요 , 데이터베이스의 데이터가 변경되지 않은 내부 데이터베이스 트랜잭션이 커밋 후에 만 업데이트되기 때문에.

 


 

 

 

두. 최선을 다하고 읽기 --- 대부분의 데이터베이스 기본 격리 수준 (제출 된 다른 트랜잭션에서 데이터를 읽을 수 있습니다)

  

같은 방법으로, 우리는 사용자 B의 현재의 트랜잭션 (transaction) 차단 레벨이 최선을 다하고 읽을 수있는 세션이 될 것입니다. 

우리는 다음과 같은 작업을 수행 할 사용자 세션 : 

. 업데이트 계정 계정-SET (200)는 계정 ID = 1;

 

 

 

우리는 (200)에 의해 ID = 사용자 1 계정 것이다. 그런 다음 귀하의 ID = 1 사용자 계정이 800이된다 발견했다.

여기서 사용자 쿼리 세션 B :

  1. select * from account;

결과는 다음과 같다 :

 

우리는 데이터가 변경되지 않았 음을 발견, 1000.

그런 다음 우리는 세션 A의 거래를 제출한다 :

범하다;

다음과 같이 세션 B에서는 쿼리 결과는 다음과 같습니다

  

 

결론 2 :

우리는 격리 수준은 현재 세션 최선을 다하고 읽기 설정하면 현재 세션에만 커밋되지 않은 데이터를 읽을 제출 다른 트랜잭션 데이터를 읽습니다.

그래서 당신은 질문이 있습니까?

그것은 우리가 동일한 트랜잭션 B 세션에서, 두 개의 서로 다른 결과를 읽는 것입니다. 이것은 비 반복 판독 결과 있으며, 그 두 가지의 판독 결과이다. 이 현상은 반복 불가능한 읽기라고합니다.

 


 

 

세 가지. 반복 읽기 (다시 읽을 수 있습니다) --- MySQL의 기본 격리 수준

 

  

지금은 수요가 그 사장이 동일한 트랜잭션 결과 쿼리는 데이터베이스 있다면, 당신은 어떻게 할 것, 일관성이 있어야했다, 거기입니까? 데이터베이스가하고있다.

우리는 세션 B 트랜잭션 격리 수준에서 현재 것은 반복 읽기입니다. 다음과 같은 특정 동작은 :

설정 세션 트랜잭션 격리 수준 반복 읽기; 
트랜잭션을 시작;

 

그런 다음 세션 B에서 데이터를 쿼리 :

 

우리는 사용자가에 위치한 데이터 세션을 추가 할 수있는 테이블을 설명 :

삽입 
 계정 (ID, 계좌) 값 ( 
3 
, 
1000 
); 
범하다;

  

그런 다음 우리는 데이터 삽입 쿼리를 봐 성공 :

 

위로 사용자 B, 우리는 결과를 조회 세션에 :

 

사용자 B는 그가의 새로운 데이터 세션 ID = 3, 값 = 1000을 삽입하고자합니다. 우리는에 따라 운영 :

 

무엇? 실제로 들어갈 수 없었다, 나는 데이터의 중복을 말할?

사용자 B, 아,에 만족하지 물론,의 때문에 나는 그것을 반복 데이터 두 아, 왜 삽입 ID = 3 데이터에 대한 쿼리?

내가 다시 볼, 내 현기증은 무엇입니까?

 

그냥 실제 사용자 A보고 사용자 B가 서로 분리되어야하며, 우리는 서로 어떻게 해야할지 모르겠어요. 사용자 B가이 현상을 확실히 튀김 헤어 아, 분명히 자료가없는 경우가 발생, 기본 키는 데이터 반복 ID = 3에 삽입 말한다.

결론 세 :

우리는 현재 세션의 격리 수준이 반복 읽기로 설정하면 현재 세션은 결과 세트에 관계없이 다른 문제의 제출되지 않은, 같은 때마다 읽기, 읽기를 반복 할 수 있습니다.

문제가 있습니까?

관심 누구, 요구 사항의 보스가 충족합니다. 읽기 트랜잭션 (반복 읽기)에 대한 데이터와 일치. 난 단지 아, 부은 얼굴 지방을로드 것을 할 수 있습니다. 데이터가 변경되었습니다,하지만, 난 여전히 일치해야합니다. 그러나 사용자 B가 직면 한 문제가, 현상이라고 팬텀 읽기 (마법의 독서 아 무엇 결국,이 곳에서 오랜 시간 동안 복잡하게 얽힌 기억).

 


 

 

 

네. 직렬화 (직렬화)

 마찬가지로, 우리는 사용자 B가 직렬화로 설정하고 업무를 설정하는 세션에 대한 트랜잭션 격리 수준은 것이다.

 

설정 
 세션 트랜잭션 격리 수준 직렬화; 
트랜잭션을 시작;

  

사용자 B, 우리는 다음과 같은 작업을 수행 세션에서 :

선택 * 에서 계정을;

결과는 다음과 같다 :

 

 

그리고 우리는 어디 세션 사용자 A의에서이 시간에 데이터를 기록?

 

우리는 시간 제한 (이 시간을 구성 할 수 있습니다), 조언을 대기 시간이 밖으로 잠금 않을 경우 사용자가 대기로 전환 세션을 발견 :

 

우리의 사용자를 기다리는 동안 세션 트랜잭션 경우 사용자가 성공적으로 작업을하라는 메시지가 표시됩니다 트랜잭션을 기록, B가 위치한 제출합니다.

결론 개의 :

우리가 직렬화에 현재 세션의 격리 수준을 다른 세션이 테이블에 쓸 때 때 정지됩니다. 당신이 가장 엄격한 격리 수준입니다 볼 수 있지만 이렇게하면 필연적으로 성능에 영향을줍니다. 실제 선택 그래서, 우리는 현재 특정 상황에 적절한 선택을 할 수 있습니다.

 

추천

출처www.cnblogs.com/xinruyi/p/11470546.html