이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 13.2. 무지개 토토 격리버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

13.2. 거래 격리

SQL표준 정의

다양한 수준에서 금지되는 현상은 다음과 같습니다.

더러운 읽기

트랜잭션은 동시에 작성된 데이터를 읽습니다

반복 할 수없는 읽기

트랜잭션은 이전에 읽은 데이터를 다시 읽습니다

Phantom Read

트랜잭션은 쿼리 세트를 다시 실행합니다

4 개의 트랜잭션 격리 수준과 해당표 13-1.

표 13-1. 기준SQL거래 격리 수준

격리 레벨 더러운 읽기 반복 할 수없는 읽기 Phantom Read
커밋되지 않은 읽기 가능 가능 가능
Committed 읽기 가능하지 않음 가능 가능
반복 가능한 읽기 가능하지 않음 가능하지 않음 가능
SERIALIZALE 가능하지 않음 가능하지 않음 가능하지 않음

inpostgresql, 당신은 할 수 있습니다postgresql구현postgresql

거래의 거래 격리 수준을 설정하려면 사용세트.

13.2.1. 헌신적 인 격리를 읽으십시오

Committed 읽기기본값입니다postgresql.select쿼리 (a절) 앞에 커밋 된 데이터 만 본다select쿼리에는 스냅 샷이 보입니다select효과가 보입니다select명령을 볼 수 있습니다select.

업데이트, 삭제, 선택공유 선택명령은와 동일하게 행동합니다selectin여기서조항) 업데이트 된 버전이선택and공유 선택,이

위 규칙으로 인해 업데이트가 가능합니다.

시작;

그러한 두 거래가 동시에 변경하려고한다면

더 복잡한 사용으로 인해 바람직하지 않은 결과가 읽을 수 있습니다삭제존재하는 데이터에서 작동하는 명령웹 사이트is웹 사이트동등한9and10:

시작;

삭제조차도 영향을 미치지 않습니다웹 사이트. hits = 10전후에 행업데이트. 이것9건너 뛰고업데이트완성 및삭제잠금을 얻고 새 행 값은 아니오입니다10하지만11, 더 이상 기준과 일치하지 않습니다.

읽기 Commited Mode가 새 새로 각 명령을 시작하기 때문에단일명령은 절대적으로 보입니다

Read Commited에 의해 제공되는 부분 트랜잭션 격리

13.2.2. 반복 가능한 읽기 격리

반복 가능한 읽기격리 레벨SQL이를위한 표준테이블. 위에서 언급했듯이, 이것은 구체적으로 허용됩니다최소각각 보호

이 레벨은 쿼리에서 저지른 읽기와 다릅니다.거래, 시작 시점이 아닙니다selecta 내 명령단일거래를 참조하십시오

이 레벨을 사용한 응용 프로그램은 재 시도해야합니다

업데이트, 삭제, 선택공유 선택명령은와 동일하게 행동합니다selectin

오류 : 동시 업데이트로 인해 액세스를 직렬화 할 수 없습니다

반복 가능한 읽기 트랜잭션은 수정하거나 잠글 수 없기 때문입니다

응용 프로그램 이이 오류 메시지를 받으면해야합니다

거래 만 업데이트해야 할 수도 있습니다

반복 가능한 읽기 모드는 엄격한 보증을 제공합니다아님세부 기록 중 하나를 참조하십시오

참고 :이전postgresql버전 9.1, 요청

13.2.3. 직렬화 가능한 분리

SERIALIZALE분리 레벨직렬화 이상a직렬화 실패.

예를 들어 테이블을 고려mytab, 처음 포함 :

클래스 | 값

직렬화 가능한 트랜잭션이 계산된다고 가정합니다 :

mytab에서 sum (value)을 선택하여 클래스 = 1;

그런 다음 결과 (30)을 삽입합니다.value새 행으로클래스 = 2.

mytab에서 sum (value)을 선택하여 클래스 = 2;

결과 300을 얻습니다.클래스 =. 그런 다음 두 거래 모두 커밋을 시도합니다.

오류 : 트랜잭션 간의 읽기/쓰기 종속성으로 인해 액세스를 일차화 할 수 없습니다

이것은 A가 b 전에 실행된다면 B가

진정한 직렬화 가능성을 보장하려면postgresql용도술어 잠금postgresql이 자물쇠는 원인이되지 않습니다아님a선택또는공유 선택

술어 잠금 장치postgresql18900_19026pg_locksa 시스템보기모드ofsireadlock. 특정 자물쇠가 획득했습니다읽기트랜잭션은 Siread 잠금 장치를 해제 할 수 있습니다읽기 전용거래가 종종있을 것입니다직렬화 가능한 읽기 전용 연기거래,전용케이스 위치

직렬화 가능한 트랜잭션의 일관된 사용은 단순화 될 수 있습니다업데이트 선택또는선택, 직렬화 가능한 트랜잭션이 가장 좋습니다

직렬화 가능에 의존 할 때 최적의 성능

  • 거래 선언으로읽기가능하면.

  • a를 사용하여 활성 연결 수를 제어합니다

  • 필요한 것보다 단일 트랜잭션에 더 많이 넣지 마십시오.

  • 연결을 방해하지 마십시오"Transaction in Transaction"보다 길다

  • 명시 적 잠금 제거,선택을 선택하십시오공유 선택보호로 인해 더 이상 필요하지 않은 곳

  • 시스템이 여러 페이지 수준을 결합해야 할 때max_pred_locks_per_transaction.

  • 순차적 스캔은 항상 필요합니다random_page_cost및/또는 증가CPU_TUPLE_COST.