데이터베이스의 것들 격리 수준

절연의 것

SQL 표준을 정의 분리의 네 가지 수준으로 다음과 같습니다 :

 

모든 수준에서 현상을 금지한다 :

더러운 읽기

트랜잭션은 다른 병렬 커밋되지 않은 트랜잭션 데이터가 기록 읽습니다.

비 반복 읽기
트랜잭션 다시 판독은 이전에 읽은 데이터는 데이터가 발견되었습니다었던 변경 (초기 읽기 이후에 제출) 다른 트랜잭션.
팬텀 읽기
A는 거래 행에 맞춰 쿼리 반환을 검색 기준의 세트를 재 - 실행 및 업무 행의 또 다른 세트가 최근 제출 및 변경 되었기 때문에 기준을 충족하는 것으로 확인.
순서 예외가
연속 실행 결과의 결과 가능성이 성공적으로 기업과 거래의 세트를 제출는 일치하지 않습니다.

용례

 시험, 예를 들어 페이지에서 기본 격리 수준을 볼 수

psql의 ( 12.0 (데비안 12.0 - 2 .pgdg100 + 1 )) 
유형 "도움" 을 위해 도움이됩니다. 

포스트 그레스 = # 쇼 transaction_isolation; 
 transaction_isolation 
- --------------------- 
 읽기  최선을 다하고 
( 1 행)
확약 읽기

대표 확약되지 않은 또 다른 세션에서 데이터를 읽을 수 있습니다 (PostgreSQL은 지원되지 않음).

커밋 된 읽기

다른 세션이 제출되었습니다에서 대표가 데이터를 읽을 수 있습니다.

기록 삽입 테스트 테이블 만들기 (1)

포스트 그레스 = # 생성  나타난 시험 (아이디 INT 이름의 문자 ( 10 ));
CREATE  TABLE의 
포스트 그레스 = # 인서트   테스트  ( 1 , ' ' );
INSERT  0  1

세션 1에서 2. 쿼리 트랜잭션

포스트 그레스 = #이 시작 ;
BEGIN 
포스트 그레스를 = # 선택  *  에서 테스트; 
 ID |     이름
 - - + ------------ 
  1  | 
( 1 행)

3. 거래 세션에서 업데이트 2

포스트 그레스 = #이 시작 ;
BEGIN 
포스트 그레스를 = # 업데이트 테스트 세트 이름 = ' '  ID = 1 ;
UPDATE 1 개 
포스트 그레스 = # 

이 경우 2 4. 아직 세션 1에서 세션 트랜잭션 쿼리를 폐쇄하지 않습니다

포스트 그레스 = # 선택  *  에서 시험; 
 ID |     이름
 - - + ------------ 
  1  | 
( 1 행)

세션에서 발견 기록은 변경되지 않습니다. 세션 2에서 거래를 제출할 때, 쿼리 값은 세션에서 변경되었습니다 1

포스트 그레스 = # 업데이트 테스트 세트 이름 = ' '  ID = 1 ;
UPDATE 1 개 
포스트 그레스 = #는 커밋 ;
범하다 

쿼리를 다시

포스트 그레스 = # 선택  *  에서 시험; 
 ID |     이름
 - - + ------------ 
  1  | 
( 1 행)
반복 읽기

그는 트랜잭션 (읽기 데이터가 수정 및 기타 세션에 제출 된 수 있습니다 경우에도) 같은 데이터를 읽고, 같은 SQL을 실행했다.

격리 수준을 수정하려면

포스트 그레스 = # 설정 default_transaction_isolation = ' 반복 읽기 ' ;
SET 
포스트 그레스 = # 쇼 transaction_isolation; 
 transaction_isolation 
- --------------------- 
 반복  읽기 
( 1 행)

세션 1의 반복 읽기 트랜잭션 쿼리를 엽니 다

포스트 그레스 = # 선택  *  에서 시험; 
 ID |     이름
 - - + ------------ 
  1  | 
( 1 행)

세션에서 업데이트 작업이

포스트 그레스 = # 업데이트 테스트 세트 이름 = " PG "  ID = 1 ;
UPDATE 1 

세션이 변경 내용을 제출하기 때문에 세션 1의 쿼리, 우리는 세션 1에 대한 기록을 찾을 수 없습니다

포스트 그레스 = # 선택  *  에서 시험; 
 ID |     이름
 - - + ------------ 
  1  | 
( 1 행)

확인 후, 제출 세션 1에서 수 및 발견 세션 1의 기록의 변화

포스트 그레스 = # 커밋 ;
COMMIT 
포스트 그레스를 = # 선택  *  에서 테스트; 
 ID |     이름
 - - + ------------ 
  1  | PG 
( 1 행)
직렬화

병렬 시뮬레이션 직렬 트랜잭션 실행을 나타냅니다, 거래 일련의 실행 규칙을 위반, 롤백됩니다.

세션 1에서 1. 직렬 업무

포스트 그레스 = # 초기  트랜잭션  격리  수준  직렬화를 ;
BEGIN

세션 2의 2. 직렬 업무

포스트 그레스 = # 초기  트랜잭션  격리  수준  직렬화를 ;
BEGIN

세션 1에서 3 삽입

포스트 그레스 = # 인서트   시험 선택  *  에서 시험;
INSERT  0  1 개 
포스트 그레스 = # 선택  *  에서 시험; 
 ID |     이름
 - - + ------------ 
  1  | 페이지
   1  | PG 
( 2 행)

제 2 세션에서 삽입

포스트 그레스 = # 인서트   시험 선택  *  에서 시험;
INSERT  0  1 개 
포스트 그레스 = # 선택  *  에서 시험; 
 ID |     이름
 - - + ------------ 
  1  | 페이지
   1  | PG 
( 2 행)

일반 쿼리를 제출할 수 있습니다 기록 세션 1 거래를 제출 5. 발견 삽입 할 수 있습니다

포스트 그레스 = # 커밋 ;
COMMIT 
포스트 그레스를 = # 선택  *  에서 테스트; 
 ID |     이름
 - - + ------------ 
  1  | 페이지
   1  | PG 
( 2 행)

6. 거래는 불평 세션이 최선을 다하고 있습니다 때

postgres=# commit;
ERROR:  could not serialize access due to read/write dependencies among transactions
DETAIL:  Reason code: Canceled on identification as a pivot, during commit attempt.
HINT:  The transaction might succeed if retried.

추천

출처www.cnblogs.com/mingfan/p/12046638.html