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

13.2. 거래 격리

theSQL표준은 4 가지 수준의 토토 사이트 격리를 정의합니다. 가장 엄격한 것은 직렬화 가능이며, 이는 단락에서 표준에 의해 정의되어 일련의 직렬화 가능한 토토 사이트 세트의 동시 실행이 한 번에 하나씩 실행하는 것과 동일한 효과를 생성 할 수 있다고 말합니다.

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

더러운 읽기

토토 사이트은 동시에 커밋되지 않은 거래에 의해 작성된 데이터를 읽습니다.

반복 할 수없는 읽기

트랜잭션은 이전에 읽은 데이터를 다시 읽고 다른 트랜잭션에 의해 데이터가 수정되었음을 발견합니다 (초기 읽기 이후에 커밋 된)..

Phantom Read

토토 사이트은 검색 조건을 만족시키는 행을 반환하는 쿼리를 다시 실행하고 최근에 커미셔닝 한 다른 토토 사이트으로 인해 조건을 만족하는 행이 변경되었음을 발견합니다..

직렬화 이상

거래 그룹을 성공적으로 커밋 한 결과는 한 번에 하나씩 해당 거래를 실행할 수있는 모든 순서와 일치하지 않습니다.

SQL 표준 및 PostgreSQL이 구현 된 트랜잭션 격리 수준에 설명되어 있습니다.표 13.1.

표 13.1. 거래 격리 수준

격리 레벨 더러운 읽기 반복 할 수없는 읽기 Phantom Read 직렬화 이상
커밋되지 않은 읽기 허용되지만 PG에서는 안됩니다 가능 가능 가능
Committed 읽기 가능하지 않음 가능 가능 가능
반복 가능한 읽기 가능하지 않음 가능하지 않음 허용되지만 PG에서는 안됩니다 가능
SERIALIZALE 가능하지 않음 가능하지 않음 가능하지 않음 가능하지 않음

inpostgresql, 4 개의 표준 트랜잭션 격리 수준 중 하나를 요청할 수 있지만 내부적으로 3 개의 별개의 격리 수준 만 구현됩니다. 이는 표준 격리 수준을 PostgreSQL의 Multiversion 동시성 제어 아키텍처에 매핑하는 유일한 현명한 방법이기 때문입니다.

테이블은 또한 PostgreSQL의 반복 가능한 읽기 구현이 Phantom 읽기를 허용하지 않는다는 것을 보여줍니다. 표준은 어떤 이상이 어떤 이상 해야하는지를 지정하기 때문에 SQL 표준에 따라 허용됩니다.아님특정 분리 수준에서 발생합니다. 더 높은 보증이 허용됩니다.

토토 사이트의 토토 사이트 격리 수준을 설정하려면 명령을 사용하십시오거래 설정.

중요

일부postgresql데이터 유형 및 함수에는 거래 동작에 관한 특별한 규칙이 있습니다. 특히 시퀀스에 대한 변경 (따라서 열의 카운터는Serial)는 다른 모든 거래에 즉시 볼 수 있으며 변경 사항이 중단 된 거래에 따라 롤백되지 않습니다. 보다PostgreSQL : 문서 : 10 : 9.16. 토토 캔 조작 기능and섹션 8.1.4.

13.2.1. 커밋 된 격리 수준 읽기

Committed|postgresql. 거래가이 격리 수준을 사용하면 aselect쿼리 (a업데이트/공유조항) 쿼리가 시작되기 전에 커밋 된 데이터 만 본다. 동시 토토 사이트에 의해 쿼리 실행 중에 커밋되지 않은 데이터 또는 변경 사항이 보이지 않습니다.select쿼리는 쿼리가 실행되기 시작하는 즉시 데이터베이스의 스냅 샷을 봅니다. 하지만,select아직 커밋되지 않았지만 자체 거래 내에서 이전 업데이트가 실행 된 효과가 보입니다. 또한 두 가지 연속select명령은 단일 토토 사이트 내에 있어도 다른 데이터를 볼 수 있습니다.select시작 및 두 번째 시작select시작.

업데이트, 삭제, 업데이트 선택공유 선택명령은와 동일하게 행동합니다select대상 행 검색 측면에서 : 명령 시작 시간에 따라 커밋 된 대상 행만 찾을 수 있습니다. 그러나 이러한 대상 행은 발견 될 때까지 다른 동시 거래에 의해 이미 업데이트 (또는 삭제 또는 잠금)되었을 수 있습니다.여기서clause)는 업데이트 된 행 버전이 여전히 검색 조건과 일치하는지 확인하기 위해 재평가되었습니다. 그렇다면 두 번째 업데이트는 업데이트 된 행의 행을 사용하여 작동을 진행합니다.업데이트 선택and공유 선택, 이것은 잠긴 행의 업데이트 버전임을 의미합니다.

삽입with충돌시 업데이트조항도 비슷하게 동작합니다. Committed 모드를 읽으면서 삽입을 위해 제안 된 각 행이 삽입 또는 업데이트됩니다.삽입, The업데이트조항은 해당 행에 영향을 미칩니다.아니오해당 행의 버전은 일반적으로 명령에 표시됩니다.

삽입with충돌에 대한 일이 없습니다조항은 다른 트랜잭션의 결과로 인해 삽입이 진행되지 않을 수 있습니다.삽입스냅 샷. 다시 말하지만, 이것은 읽기 커밋 모드의 경우에만 해당됩니다.

위 규칙으로 인해 업데이트 명령이 일관되지 않은 스냅 샷을 볼 수 있습니다. 업데이트하려는 동일한 행에 동시 업데이트 명령의 영향을 볼 수 있지만 데이터베이스의 다른 행에 대한 해당 명령의 영향은 보이지 않습니다. 이 동작은 복잡한 검색 조건을 포함하는 명령에 부적합한 모드를 부적절하게 만듭니다.

시작;

그러한 두 거래가 동시에 계정 잔액 12345를 변경하려고하면 두 번째 트랜잭션이 계정 행의 업데이트 된 버전으로 시작하기를 분명히 원합니다. 각 명령은 미리 정해진 행에만 영향을 미치기 때문에 업데이트 된 행 버전을 볼 수있게하면 번거로운 불일치가 발생하지 않습니다.

더 복잡한 사용은 읽기 커밋 모드에서 바람직하지 않은 결과를 생성 할 수 있습니다. 예를 들어, 고려하십시오.삭제다른 명령에 의해 추가 및 제한 기준에서 추가되고 제거되는 데이터에서 작동하는 명령, 예를 들어, 가정웹 사이트웹 사이트동등한9and10:

시작;

the삭제에도 불구하고 효과가 없을 것입니다웹 사이트. hits = 10전후에 행업데이트. 이것은 사전 행 행 값이 발생하기 때문에 발생합니다9건너 뛰고업데이트완성 및삭제잠금을 얻고 새 행 값이 더 이상 없어10그러나11, 더 이상 기준과 일치하지 않습니다.

read commited mode는 해당 순간에 커밋 된 모든 토토 사이트을 포함하는 새로운 스냅 샷으로 각 명령을 시작하기 때문에 동일한 토토 사이트의 후속 명령은 어떤 경우에도 커밋 된 동시 거래의 영향을 볼 수 있습니다. 위의 문제점은 A인지 여부입니다.단일명령은 데이터베이스의 절대적으로 일관된 견해를 보게됩니다.

Read Commited Mode에 의해 제공되는 부분 트랜잭션 격리는 많은 응용 프로그램에 적합 하며이 모드는 빠르고 사용하기가 간단합니다. 그러나 모든 경우에 충분하지는 않습니다.

13.2.2. 반복 가능한 읽기 격리 수준

the반복 가능한 읽기격리 수준은 거래가 시작되기 전에 커밋 된 데이터 만 볼 수 있습니다. 동시 토토 사이트에 의해 토토 사이트 실행 중에 커밋되지 않은 데이터 또는 변경 사항이 보이지 않습니다.SQL이 격리 수준의 표준 및에 설명 된 모든 현상을 방지합니다표 13.1직렬화 이상을 제외하고. 위에서 언급했듯이, 이것은 표준에 의해 구체적으로 허용되며, 여기는에 대해서만 설명합니다.최소보호는 각 격리 수준이 제공해야합니다.

이 레벨은 반복 가능한 읽기 트랜잭션의 쿼리가에서 첫 번째 비 변환 제어 명령문의 시작 시점에서 스냅 샷을 봅니다.거래따라서 연속selecta 명령단일트랜잭션은 동일한 데이터를 참조하십시오. 즉, 자체 거래가 시작된 후 커밋 된 다른 거래의 변경 사항이 표시되지 않습니다..

이 레벨을 사용하는 응용 프로그램은 직렬화 실패로 인해 거래를 재 시도하기 위해 준비해야합니다.

업데이트, 삭제, 업데이트 선택공유 선택명령은와 동일하게 행동합니다select​​대상 행 검색 측면에서 : 트랜잭션 시작 시간에 따라 커밋 된 대상 행만 찾을 수 있습니다. 그러나 이러한 대상 행은 발견 될 때까지 다른 동시 거래에 의해 이미 업데이트 (또는 삭제 또는 잠금)되었을 수 있습니다.

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

반복 가능한 읽기 트랜잭션은 반복 가능한 읽기 트랜잭션이 시작된 후 다른 트랜잭션에 의해 변경되거나 잠금 행을 수정하거나 잠금 할 수 없기 때문에

응용 프로그램 이이 오류 메시지를 받으면 현재 트랜잭션을 중단하고 처음부터 전체 트랜잭션을 재 시도해야합니다. 두 번째로, 트랜잭션은 이전에 커미셔닝 된 변경을 데이터베이스의 초기보기의 일부로 볼 것이므로 새 버전의 새로운 버전을 새 트랜잭션 업데이트의 시작점으로 사용하는 데 논리적 인 충돌이 없습니다..

거래 만 업데이트하는 것만 재조정해야 할 수도 있습니다. 읽기 전용 거래는 직렬화 충돌이 없습니다.

반복 가능한 읽기 모드는 각 트랜잭션이 데이터베이스의 완전히 안정적인보기를 본다는 엄격한 보증을 제공합니다. 그러나이 견해는 반드시 같은 수준의 동시 트랜잭션의 일부 직렬 (한 번에 하나씩) 실행과 일치하지는 않습니다.아님제어 레코드의 이전 개정판을 읽기 때문에 배치의 논리적 인 일부인 세부 레코드 중 하나를 참조하십시오. 이 격리 수준에서 실행되는 거래에 의해 비즈니스 규칙을 시행하려는 시도는 충돌하는 거래를 차단하기 위해 명시 적 잠금 장치를 신중하게 사용하지 않으면 올바르게 작동하지 않을 것입니다.

20077_20222스냅 샷 격리. 동시성을 줄이는 전통적인 잠금 기술을 사용하는 시스템과 비교할 때 행동과 성능의 차이가 관찰 될 수 있습니다.[Berenson95].

Note

이전postgresql버전 9.1, 직렬화 가능한 트랜잭션 격리 수준에 대한 요청은 여기에 설명 된 동일한 동작을 제공했습니다. 레거시 직렬화 가능한 동작을 유지하려면 이제 반복 가능한 읽기가 요청되어야합니다.

13.2.3. 직렬화 가능한 분리 수준

theSERIALIZALE격리 수준은 가장 엄격한 트랜잭션 격리를 제공합니다. 이 수준은 모든 커밋 된 거래에 대한 직렬 거래 실행을 에뮬레이션합니다.직렬화 이상a 트리거직렬화 실패.

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

클래스 | 값

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

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

그런 다음 결과 (30)을로 삽입합니다.value새 행으로클래스 = 2. 동시에, 직렬화 가능한 트랜잭션 B 계산 :

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

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

오류 : 토토 사이트 간의 읽기/쓰기 종속성으로 인해 액세스를 일련화 할 수 없습니다

A가 B 전에 실행 된 경우 B가 300이 아닌 합계 330을 계산했을 것이기 때문에 다른 순서는 A에 의해 다른 합계를 계산했을 것입니다.

이상을 방지하기 위해 직렬화 가능한 트랜잭션에 의존 할 때, 영구 사용자 테이블에서 읽은 데이터는 읽은 트랜잭션이 성공적으로 저지른 것으로 간주되지 않는 것이 중요합니다. 데이터 내에서 읽은 데이터를 제외하고는 읽기 전용 트랜잭션에도 해당됩니다.연기 가능읽기 전용 트랜잭션은 데이터를 읽기 시작하기 전에 그러한 문제가없는 스냅 샷을 획득 할 때까지 기다리는 대기하기 때문에 읽기가 읽히 자마자 유효한 것으로 알려져 있습니다. 다른 모든 경우에 응용 프로그램은 나중에 중단 된 거래 중에 읽은 결과에 의존해서는 안됩니다.

진정한 직렬화 가능성을 보장하려면postgresql용도술어 잠금, 이는 글이 언제 읽었는지 결정할 수있는시기를 결정할 수있는 잠금 장치를 유지하여 동시 거래에서 이전 읽기 결과에 먼저 실행되었다는 것을 의미합니다. 안에postgresql이 자물쇠는 차단을 유발하지 않으므로아님교착 상태를 일으키는 부분을 플레이하십시오. 그것들은 특정 조합에서 직렬화 이상으로 이어질 수있는 동시 직렬화 가능한 트랜잭션 간의 종속성을 식별하고 플래그 의존하는 데 사용됩니다.업데이트 선택또는공유 선택다른 토토 사이트을 차단할 수있을뿐만 아니라 디스크 액세스를 유발할 수 있습니다.

술어 잠금 장치postgresql, 대부분의 다른 데이터베이스 시스템과 마찬가지로 토토 사이트에서 실제로 액세스하는 데이터를 기반으로합니다. 이것들은에 나타날 것입니다.pg_locksa 시스템보기모드ofsireadlock. 쿼리 실행 중에 획득 한 특정 잠금 장치는 쿼리에서 사용하는 계획에 따라 다르며, 토토 사이트 과정에서 다수의 더 미세한 잠금 장치 (예 : 튜플 잠금 장치)가 더 적은 수의 거친 자물쇠 (예 : 페이지 잠금)로 결합하여 자물쇠를 추적하는 데 사용되는 메모리의 피로를 방지 할 수 있습니다.읽기 전용트랜잭션은 완료되기 전에 Siread 잠금을 해제 할 수 있습니다. 충돌이 여전히 발생할 수 없음을 감지하여 직렬화 이상으로 이어질 수 있습니다. 사실은,읽기 전용트랜잭션은 종종 시작시 해당 사실을 설정하고 술어 잠금 장치를 피할 수 있습니다. 명시 적으로 요청하면직렬화 가능한 읽기 전용 연기거래는이 사실을 확립 할 수있을 때까지 차단됩니다. (이것은입니다.전용직렬화 가능한 트랜잭션이 차단되지만 반복 가능한 읽기 트랜잭션이없는 경우) 반면에, SIREAD 잠금 장치는 종종 트랜잭션을 넘어서야합니다.

직렬화 가능한 트랜잭션의 일관된 사용은 개발을 단순화 할 수 있습니다. 성공적으로 성공적으로 커밋 된 동시 직렬화 가능한 트랜잭션 세트는 한 번에 하나씩 실행되는 것과 같은 효과를 갖는다는 것은 서면으로 단일 거래가 자체적으로 운영 될 때 올바른 일을 할 수 있음을 입증 할 수 있다는 것을 의미합니다. 다른 트랜잭션이 수행 할 수있는 일에 대한 정보가 없을 수도 있고, 어떤 거래를 수행 할 수 있는지에 대한 정보가 없어도 올바른 일을 할 수 있음을 입증 할 수 있습니다.업데이트 선택또는공유 선택, 직렬화 가능한 트랜잭션은 일부 환경에서 최상의 성능 선택입니다.

whilepostgresql의 직렬화 가능한 트랜잭션 격리 수준은 동시 트랜잭션만이 같은 효과를 낼 수있는 일련의 실행 순서가 있음을 증명할 수있는 경우에만 커밋 할 수있게합니다. 실제 일련의 실행에서 발생하지 않는 오류가 항상 발생하는 것을 방해하지는 않습니다. 특히, 삽입을 시도하기 전에 키가 존재하지 않는지 명시 적으로 확인한 후에도 겹치는 일련의 트랜잭션과의 충돌로 인한 고유 한 제약 위반을 볼 수 있습니다.all잠재적으로 충돌하는 키를 먼저 삽입하는 시리얼이 가능한 트랜잭션은 먼저 그렇게 할 수 있는지 명시 적으로 확인합니다. 예를 들어, 사용자에게 새 키를 요청하는 응용 프로그램을 상상 한 다음 먼저 선택하여 아직 존재하지 않는지 확인하거나 최대 기존 키를 선택하고 추가하여 새 키를 생성합니다.

동시성 제어를 위해 직렬화 가능한 트랜잭션에 의존 할 때 최적의 성능을 얻으려면 이러한 문제를 고려해야합니다.

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

  • 필요한 경우 연결 풀을 사용하여 활성 연결 수를 제어하십시오. 이것은 항상 중요한 성능 고려 사항이지만 직렬화 가능한 트랜잭션을 사용하는 바쁜 시스템에서 특히 중요 할 수 있습니다.

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

  • 연결을 방해하지 마십시오토토 사이트의 유휴 상태필요한 것보다 길다. 구성 매개 변수idle_in_transaction_session_timeout남은 세션을 자동으로 분리하는 데 사용될 수 있습니다.

  • 명시 적 잠금 제거,업데이트 선택공유 선택직렬화 가능한 트랜잭션에 의해 자동으로 제공되는 보호로 인해 더 이상 필요하지 않은 경우.

  • 시스템이 여러 페이지 수준의 술어 잠금을 단일 관계 수준의 술어 잠금 장치로 결합해야 할 때 술어 잠금 테이블이 메모리가 부족하기 때문에 직렬화 실패 속도가 증가 할 수 있습니다. 당신은 증가하여 이것을 피할 수 있습니다max_pred_locks_per_transaction, max_pred_locks_per_relation및/또는max_pred_locks_per_page.

  • 순차적 스캔은 항상 관계 수준의 술어 잠금 장치를 필요로합니다. 이로 인해 직렬화 실패 속도가 증가 할 수 있습니다.random_page_cost및/또는 증가CPU_TUPLE_COST. 토토 사이트 롤백의 감소와 쿼리 실행 시간의 전반적인 변경에 비해 다시 시작하십시오.

직렬화 가능한 분리 수준은 학술 데이터베이스 문헌에서 알려진 스냅 샷 분리로 알려진 기술을 사용하여 구현되며, 이는 직렬화 이상에 대한 검사를 추가하여 스냅 샷 분리를 기반으로합니다. 전통적인 잠금 기술을 사용하는 다른 시스템과 비교할 때 행동과 성능의 일부 차이가 관찰 될 수 있습니다.[Ports12]자세한 정보는