절연의 것
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.