theSQL표준은 4 가지 수준의 토토 핫 격리를 정의합니다. 가장 엄격한 것은 직렬화 가능이며, 이는 단락에서 표준에 의해 정의되어 일련의 직렬화 가능한 토토 핫 세트의 동시 실행이 한 번에 하나씩 실행하는 것과 동일한 효과를 생성 할 수 있다고 말합니다. 다른 세 가지 수준은 현상 측면에서 정의되며, 동시 거래 간의 상호 작용으로 인해 각 레벨에서 발생하지 않아야합니다. 표준은 직렬화 가능의 정의로 인해 이러한 현상 중 어느 것도 해당 수준에서 불가능하다고 지적합니다. (이것은 놀라운 일이 아닙니다. 거래의 효과가 한 번에 하나씩 실행 된 것과 일치해야한다면 상호 작용으로 인한 현상을 어떻게 볼 수 있습니까?)
다양한 수준에서 금지되는 현상은 다음과 같습니다.
토토 핫은 동시에 커밋되지 않은 거래에 의해 작성된 데이터를 읽습니다.
토토 핫은 이전에 읽은 데이터를 다시 읽고 다른 토토 핫에 의해 데이터가 수정되었음을 발견합니다 (초기 읽기 이후에 커밋 된)..
토토 핫은 검색 조건을 만족시키는 행을 반환하는 쿼리를 다시 실행하고 최근에 커미셔닝 된 또 다른 토토 핫으로 인해 조건을 만족하는 행이 변경되었음을 발견합니다..
거래 그룹을 성공적으로 커밋 한 결과는 한 번에 하나씩 해당 거래를 실행할 수있는 모든 순서와 일치하지 않습니다.
SQL 표준 및 PostgreSQL 구현 트랜잭션 격리 수준이에 설명되어 있습니다.표 13.1.
표 13.1. 거래 격리 수준
격리 레벨 | 더러운 읽기 | 반복 할 수없는 읽기 | Phantom Read | 직렬화 이상 |
---|---|---|---|---|
커밋되지 않은 읽기 | 허용되지만 PG에서는 아님 | 가능 | 가능 | 가능 |
Committed 읽기 | 불가능 | 가능 | 가능 | 가능 |
반복 가능한 읽기 | 불가능 | 불가능 | 허용되지만 PG에서는 안됩니다 | 가능 |
SERIALIZALE | 불가능 | 불가능 | 불가능 | 불가능 |
inpostgresql, 4 개의 표준 트랜잭션 격리 수준 중 하나를 요청할 수 있지만 내부적으로 3 개의 별개의 격리 수준 만 구현됩니다. 이는 표준 격리 수준을 PostgreSQL의 Multiversion 동시성 제어 아키텍처에 매핑하는 유일한 현명한 방법이기 때문입니다.
테이블은 PostgreSQL의 반복 가능한 읽기 구현이 Phantom 읽기를 허용하지 않는다는 것을 보여줍니다. 표준은 어떤 이상이 어떤 이상 해야하는지를 지정하기 때문에 SQL 표준에 따라 허용됩니다.not특정 분리 수준에서 발생합니다. 더 높은 보증이 허용됩니다. 이용 가능한 격리 수준의 동작은 다음 하위 섹션에 자세히 설명되어 있습니다.
토토 핫의 토토 핫 격리 수준을 설정하려면 명령을 사용하십시오토토 핫 설정.
일부PostgreSQL데이터 유형 및 기능에는 거래 동작에 관한 특별한 규칙이 있습니다. 특히 시퀀스에 대한 변경 (따라서 열의 카운터는Serial
)는 다른 모든 거래에 즉시 볼 수 있으며 변경 사항이 중단 된 거래가 롤백되지 않습니다. 보다PostgreSQL : 문서 : 15 : 9.17. 사설 토토 사이트 조작 기능and섹션 8.1.4.
Committed의 기본 격리 레벨입니다PostgreSQL. 거래가이 격리 수준을 사용하면 aselect
쿼리 (a업데이트/공유
조항) 쿼리가 시작되기 전에 커밋 된 데이터 만 본다. 동시 토토 핫에 의해 쿼리 실행 중에 커밋되지 않은 데이터 또는 변경 사항이 보이지 않습니다. 사실상 Aselect
쿼리는 쿼리가 실행되기 시작하는 순간에 데이터베이스의 스냅 샷을 봅니다. 하지만,select
아직 커밋되지 않았지만 자체 거래 내에서 이전 업데이트가 실행 된 효과가 보입니다. 또한 두 가지 연속select
명령은 단일 토토 핫 내에 있더라도 다른 데이터를 볼 수 있습니다.select
두 번째 시작과 두 번째 전select
시작.
업데이트
, 삭제
, 업데이트 선택
및공유 선택
명령은와 동일하게 행동합니다select
대상 행 검색 측면에서 : 명령 시작 시간에 따라 커밋 된 대상 행만 찾을 수 있습니다. 그러나 이러한 대상 행은 발견 될 때까지 다른 동시 거래에 의해 이미 업데이트 (또는 삭제 또는 잠금)되었을 수 있습니다. 이 경우 업데이트가 최초의 업데이트 트랜잭션이 커밋 또는 롤백을 기다릴 때까지 기다립니다 (여전히 진행중인 경우). 첫 번째 업데이트가 롤백되면 그 효과가 부정되고 두 번째 업데이트는 원래 발견 된 행을 업데이트 할 수 있습니다. 첫 번째 업데이트가 커밋하면 첫 번째 업데이트가 삭제 된 경우 두 번째 업데이트는 행을 무시합니다. 그렇지 않으면 업데이트 된 행의 행에 작업을 적용하려고 시도합니다. 명령의 검색 조건 (여기서
clause)는 업데이트 된 행의 행 버전이 여전히 검색 조건과 일치하는지 확인하기 위해 재평가되었습니다. 그렇다면 두 번째 업데이트는 업데이트 된 행의 행을 사용하여 작동을 진행합니다. 의 경우업데이트 선택
and공유 선택
, 이것은 잠긴 행의 업데이트 버전임을 의미합니다.
삽입
with충돌에 대한 업데이트
조항도 비슷하게 동작합니다. Committed 모드를 읽으면서 삽입을 위해 제안 된 각 행이 삽입 또는 업데이트됩니다. 관련이없는 오류가 없으면이 두 가지 결과 중 하나가 보장됩니다. 충돌이 다른 거래에서 시작되는 경우, 그 효과는 아직에 영향을 미치지 않습니다.삽입
, the업데이트
조항은 그 행에 영향을 미칩니다.아니오해당 행의 버전은 일반적으로 명령에 표시됩니다.
삽입
with갈등에 대한 일은 아무것도 없습니다
조항은 다른 트랜잭션의 결과로 인해 삽입이 진행되지 않을 수 있습니다.삽입
스냅 샷. 다시 말하지만, 이것은 읽기 커밋 모드의 경우에만 해당됩니다.
병합
사용자가 다양한 조합을 지정할 수 있습니다삽입
, 업데이트
and삭제
서브 명령. 에이병합
둘 다 명령삽입
및업데이트
하위 명령은와 비슷해 보입니다삽입
with충돌시 업데이트
조항이지만 그 중 하나를 보장하지 않습니다삽입
또는업데이트
발생합니다. 만약에병합
시도 an업데이트
또는삭제
그리고 행이 동시에 업데이트되지만 조인 조건은 현재 대상과 현재 소스 튜플의 경우 전달됩니다.병합
|업데이트
또는삭제
업데이트 된 행의 행에 작업을 수행하고 수행합니다. 그러나 왜냐하면병합
몇 가지 작업을 지정할 수 있으며 조건부가 될 수 있습니다. 원래 일치 한 작업이 동작 목록에 나중에 나타나더라도 첫 번째 조치에서 시작하여 각 작업의 조건이 첫 번째 조치에서 시작됩니다. 반면에, 행이 동시에 업데이트되거나 삭제되면 조인 조건이 실패하면병합
조건을 평가합니다일치하지 않음
다음에 행동하고 성공한 첫 번째를 실행합니다. 만약에병합
시도 an삽입
고유 한 인덱스가 있으며 중복 행이 동시에 삽입되고 고유성 위반 오류가 제기됩니다.병합
평가를 다시 시작하여 그러한 오류를 피하려고 시도하지 않습니다일치
조건
위의 규칙으로 인해 업데이트 명령이 일관되지 않은 스냅 샷을 볼 수 있습니다. 업데이트하려는 동일한 행에 동시 업데이트 명령의 영향을 볼 수 있지만 데이터베이스의 다른 행에 해당 명령의 영향을 볼 수는 없습니다. 이 동작은 복잡한 검색 조건을 포함하는 명령에 부적합한 모드를 부적절하게 만듭니다. 그러나 더 간단한 경우에 적합합니다. 예를 들어 :와 같은 거래로 은행 잔액을 업데이트하는 것을 고려하십시오.
시작; 업데이트 계정 설정 밸런스 = 밸런스 + 100.00 여기서 acctnum = 12345; 업데이트 계정 설정 밸런스 = 밸런스 -100.00 여기서 acctnum = 7534; 저지르다;
그러한 두 거래가 동시에 계정 잔액을 변경하려고 시도하면 두 번째 트랜잭션이 계정 행의 업데이트 된 버전으로 시작하기를 분명히 원합니다. 각 명령은 미리 정해진 행에만 영향을 미치기 때문에 업데이트 된 행 버전을 볼 수있게하면 번거로운 불일치가 발생하지 않습니다.
더 복잡한 사용은 읽기 커밋 모드에서 바람직하지 않은 결과를 생성 할 수 있습니다. 예를 들어, 고려하십시오.삭제
다른 명령에 의해 제한 기준에서 추가되고 제거되는 데이터에서 작동하는 명령, 예를 들어, 가정웹 사이트
|웹 사이트. hits
동등한9
및10
:
시작; 업데이트 웹 사이트 세트 hits = hits + 1; - 다른 세션에서 실행 : hits = 10 인 웹 사이트에서 삭제; 저지르다;
the삭제
에도 불구하고 효과가 없습니다웹 사이트. hits = 10
전후에 행업데이트
. 이것은 사전 행 행 값이 발생하기 때문에 발생합니다9
건너 뛰고업데이트
완성 및삭제
잠금을 얻고 새 행 값이 더 이상 없어10
그러나11
, 더 이상 기준과 일치하지 않습니다.
Read Commited Mode가 해당 순간에 커밋 된 모든 토토 핫을 포함하는 새로운 스냅 샷으로 각 명령을 시작하기 때문에 동일한 거래에서 후속 명령은 커밋 된 동시 거래의 효과가 보입니다. 위의 문제점은 A인지 여부입니다.단일명령은 데이터베이스의 절대적으로 일관된 견해를 보게됩니다.
Read Commited Mode에 의해 제공되는 부분 트랜잭션 격리는 많은 응용 프로그램에 적합 하며이 모드는 빠르고 사용하기가 간단합니다. 그러나 모든 경우에 충분하지는 않습니다. 복잡한 쿼리 및 업데이트를 수행하는 응용 프로그램에는 읽기 Commited Mode가 제공하는 것보다 데이터베이스의보다 엄격하게 일관된보기가 필요할 수 있습니다.
the반복 가능한 읽기격리 수준은 거래가 시작되기 전에 커밋 된 데이터 만 본다. 동시 트랜잭션에 의해 트랜잭션 실행 중에 커밋되지 않은 데이터 또는 변경 사항이 보이지 않습니다. (그러나 쿼리는 아직 커밋되지 않더라도 자체 거래 내에서 실행 된 이전 업데이트의 효과를 볼 수 있습니다.) 이것은보다 강력한 보증입니다.SQL이 격리 수준의 표준 및에 설명 된 모든 현상을 방지합니다표 13.1직렬화 이상을 제외하고. 위에서 언급했듯이, 이것은 표준에 의해 구체적으로 허용되며, 여기는에 대해서만 설명합니다.최소보호는 각 격리 수준이 제공해야합니다.
이 레벨은 반복 가능한 읽기 트랜잭션의 쿼리가에서 첫 번째 비 번도 제어 명령문이 시작될 때 스냅 샷을 봅니다.거래따라서 연속select
a 명령단일트랜잭션은 동일한 데이터를 참조하십시오. 즉, 자체 거래가 시작된 후 커밋 된 다른 거래의 변경 사항이 표시되지 않습니다..
이 레벨을 사용하는 응용 프로그램은 직렬화 실패로 인해 거래를 재 시도하기 위해 준비해야합니다.
업데이트
, 삭제
, 병합
, 업데이트 선택
및공유 선택
명령은와 동일하게 행동합니다.select
대상 행 검색 측면에서 : 트랜잭션 시작 시간에 따라 커밋 된 대상 행만 찾을 수 있습니다. 그러나 이러한 대상 행은 발견 될 때까지 다른 동시 거래에 의해 이미 업데이트 (또는 삭제 또는 잠금)되었을 수 있습니다. 이 경우 반복 가능한 읽기 트랜잭션은 첫 번째 업데이트 트랜잭션이 커밋 또는 롤백을 기다릴 때까지 기다립니다 (여전히 진행중인 경우). 첫 번째 업데이트가 롤백되면 그 효과가 부정되고 반복 가능한 읽기 트랜잭션은 원래 발견 된 행을 업데이트 할 수 있습니다. 그러나 첫 번째 업데이트가 커밋하는 경우 (실제로 행을 업데이트하거나 삭제 한 경우) 반복 가능한 읽기 트랜잭션은 메시지와 함께 롤백됩니다
오류 : 동시 업데이트로 인해 액세스를 직렬화 할 수 없습니다
반복 가능한 읽기 트랜잭션은 반복 가능한 읽기 트랜잭션이 시작된 후 다른 트랜잭션에 의해 변경 될 수 없거나 잠금 행을 수정하거나 잠금 할 수 없기 때문에
응용 프로그램 이이 오류 메시지를 받으면 현재 트랜잭션을 중단하고 처음부터 전체 트랜잭션을 재 시도해야합니다. 두 번째로, 트랜잭션은 이전에 커미셔닝 된 변경을 데이터베이스의 초기보기의 일부로 볼 것이므로 새 버전의 새로운 버전을 새 트랜잭션 업데이트의 시작점으로 사용하는 데 논리적 인 충돌이 없습니다..
거래 만 업데이트하는 것만 재조정해야 할 수도 있습니다. 읽기 전용 거래는 직렬화 충돌이 없습니다.
반복 가능한 읽기 모드는 각 트랜잭션이 데이터베이스의 완전히 안정적인보기를 본다는 엄격한 보증을 제공합니다. 그러나이 견해는 반드시 같은 수준의 동시 트랜잭션의 일부 직렬 (한 번에 하나씩) 실행과 일치하지는 않습니다. 예를 들어,이 수준의 읽기 전용 트랜잭션조차도 배치가 완료되었음을 보여주기 위해 제어 레코드가 업데이트 될 수 있지만not제어 레코드의 이전 개정을 읽기 때문에 배치의 논리적 인 부분 인 세부 레코드 중 하나를 참조하십시오. 이 격리 수준에서 실행되는 거래에 의해 비즈니스 규칙을 시행하려는 시도는 충돌하는 거래를 차단하기 위해 명시 적 잠금 장치를 신중하게 사용하지 않으면 올바르게 작동하지 않을 것입니다.
반복 가능한 읽기 격리 수준은 학술 데이터베이스 문헌 및 일부 다른 데이터베이스 제품에서 알려진 기술을 사용하여 구현됩니다.스냅 샷 격리. 동시성을 줄이는 전통적인 잠금 기술을 사용하는 시스템과 비교할 때 행동과 성능의 차이가 관찰 될 수 있습니다. 일부 다른 시스템은 반복 가능한 읽기 및 스냅 샷 분리를 다른 동작을 가진 뚜렷한 분리 수준으로 제공 할 수도 있습니다. 두 기술을 구별하는 허용 된 현상은 SQL 표준이 개발 된 후까지 데이터베이스 연구원에 의해 공식화되지 않았 으며이 매뉴얼의 범위를 벗어났습니다. 완전한 치료를 원하시면 참조하십시오.[Berenson95].
이전PostgreSQL버전 9.1, 직렬화 가능한 트랜잭션 격리 수준에 대한 요청은 여기에 설명 된 동일한 동작을 정확히 제공했습니다. 레거시 직렬화 가능한 동작을 유지하려면 이제 반복 가능한 읽기가 요청되어야합니다.
theSERIALIZABLE격리 수준은 가장 엄격한 트랜잭션 격리를 제공합니다. 이 수준은 모든 커밋 된 거래에 대한 직렬 거래 실행을 에뮬레이션합니다. 마치 거래가 동시에보다 연속적으로 실행 된 것처럼. 그러나 반복 가능한 읽기 레벨과 마찬가지로이 레벨을 사용하는 응용 프로그램은 직렬화 실패로 인해 트랜잭션을 재 시도 할 준비를해야합니다. 실제로,이 격리 수준은 동시 직렬화 가능한 트랜잭션 세트를 실행할 수있는 조건을 모니터링한다는 점을 제외하고는 반복 가능한 읽기와 정확히 동일하게 작동합니다. 이 모니터링은 반복 가능한 읽기로 현재의 차단을 소개하지 않지만 모니터링에 대한 오버 헤드와 A를 유발할 수있는 조건의 탐지가 있습니다.직렬화 이상a 트리거직렬화 실패.
예를 들어, 테이블을 고려Mytab
, 처음 포함 :
클래스 | 값 -------+------- 1 | 10 1 | 20 2 | 100 2 | 200
직렬화 가능한 트랜잭션이 계산된다고 가정 해 봅시다 :
mytab에서 sum (value)을 선택하여 클래스 = 1;
그런 다음 결과 (30)을 삽입합니다.value
새 행으로클래스
= 2
. 동시에, 직렬화 가능한 트랜잭션 B 계산 :
mytab에서 sum (value)을 선택하여 클래스 = 2;
결과 300을 얻습니다.클래스
= 1
. 그런 다음 두 거래 모두 커밋을 시도합니다. 중 하나가 반복 가능한 읽기 격리 수준에서 실행 된 경우 둘 다 커밋 할 수 있습니다. 그러나 결과와 일치하는 일련의 실행 순서가 없기 때문에 직렬화 가능한 트랜잭션을 사용하면 한 트랜잭션이 커밋 할 수 있으며이 메시지로 다른 트랜잭션을 다시 굴립니다.
오류 : 토토 핫 간 읽기/쓰기 종속성으로 인해 액세스를 일련화 할 수 없습니다
A가 B 전에 실행 된 경우 B가 300이 아닌 합계 330을 계산했을 것이기 때문에 다른 순서는 A에 의해 다른 합계를 계산했을 것입니다.
이상을 방지하기 위해 직렬화 가능한 트랜잭션에 의존 할 때, 영구 사용자 테이블에서 읽은 데이터는 읽은 트랜잭션이 성공적으로 저지른 것으로 간주되지 않는 것이 중요합니다. 데이터 내에서 읽은 데이터를 제외하고는 읽기 전용 트랜잭션에도 해당됩니다.연기 가능읽기 전용 트랜잭션은 읽는 즉시 유효한 것으로 알려져 있습니다. 이러한 트랜잭션은 데이터를 읽기 전에 그러한 문제가없는 스냅 샷을 얻을 수있을 때까지 기다립니다. 다른 모든 경우에 응용 프로그램은 나중에 중단 된 거래 중에 읽은 결과에 의존해서는 안됩니다. 대신, 그들은 거래가 성공할 때까지 거래를 다시 시도해야합니다.
진정한 직렬화 가능성을 보장하려면PostgreSQL용도술어 잠금, 이는 서기가 언제 읽었는지 판단 할 수있는 자물쇠를 유지하여 동시 거래에서 이전 판독 값에 영향을 미쳤을 때, 먼저 실행되었다는 것을 의미합니다. 안에PostgreSQL이 자물쇠는 차단을 유발하지 않으므로아님교착 상태를 일으키는 부분을 재생합니다. 그것들은 특정 조합에서 직렬화 이상으로 이어질 수있는 동시 직렬화 가능한 트랜잭션 간의 종속성을 식별하고 플래그 의존하는 데 사용됩니다. 대조적으로, 데이터 일관성이 전체 테이블에서 잠금 장치를 꺼내야 할 수있는 읽기 또는 반복 가능한 읽기 트랜잭션은 다른 사용자가 해당 테이블을 사용하려고 시도하는 것을 차단하거나 사용할 수 있습니다.업데이트 선택
또는공유 선택
다른 토토 핫을 차단할 수있을뿐만 아니라 디스크 액세스를 유발할 수 있습니다.
술어 잠금 장치PostgreSQL는 대부분의 다른 데이터베이스 시스템과 마찬가지로 토토 핫에서 실제로 액세스하는 데이터를 기반으로합니다. 이것들은에 나타날 것입니다.PG_LOCKS
a 시스템보기모드
ofsireadlock
. 쿼리 실행 중에 획득 한 특정 잠금 장치는 쿼리에서 사용하는 계획에 따라 다르며, 토토 핫 과정에서 다수의 더 미세한 잠금 장치 (예 : 튜플 잠금 장치)가 더 적은 수의 거친 자물쇠 (예 : 페이지 잠금)로 결합하여 자물쇠를 추적하는 데 사용되는 메모리의 피로를 방지 할 수 있습니다. 에이읽기 전용
트랜잭션은 완료되기 전에 Siread 잠금을 해제 할 수 있습니다. 충돌이 여전히 발생할 수 없음을 감지하여 직렬화 이상으로 이어질 수 있습니다. 사실은,읽기 전용
트랜잭션은 종종 시작시 해당 사실을 설정하고 술어 잠금 장치를 피할 수 있습니다. 명시 적으로 요청하면직렬화 가능한 읽기 전용 연기 가능
토토 핫은이 사실을 확립 할 수있을 때까지 차단됩니다. (이것은입니다.전용직렬화 가능한 트랜잭션이 차단되지만 반복 가능한 읽기 트랜잭션이없는 경우) 반면에, SIREAD 잠금 장치는 종종 트랜잭션을 넘어서야합니다.
직렬화 가능한 트랜잭션의 일관된 사용은 개발을 단순화 할 수 있습니다. 성공적으로 성공적으로 커밋 된 동시 직렬화 가능한 트랜잭션 세트는 한 번에 하나씩 실행되는 것과 같은 효과를 갖는다는 것은 서면으로 단일 거래가 자체적으로 운영 될 때 올바른 일을 할 수 있음을 입증 할 수 있다는 것을 의미합니다. 다른 트랜잭션이 수행 할 수있는 일에 대한 정보가 없을 수도 있고, 어떤 거래를 수행 할 수 있는지에 대한 정보가 없어도 올바른 일을 할 수 있음을 입증 할 수 있습니다. 이 기술을 사용하는 환경은 직렬화 실패를 처리하는 일반화 된 방법을 가지고 있어야합니다 (“40001 '의 SQLSTATE 값으로 항상 반환 됨). 왜냐하면 어떤 트랜잭션이 읽기/쓰기 종속성에 기여할 수 있는지 정확히 예측하기가 매우 어렵 기 때문에 직렬화 이상을 방지하기 위해 다시 롤백해야합니다. 읽기/쓰기 종속성의 모니터링에는 직렬화 실패로 종료되는 트랜잭션의 재시작과 마찬가지로 비용이 발생하지만 명시 적 잠금 장치 사용과 관련된 비용 및 차단과 균형을 이룹니다.업데이트 선택
또는공유 선택
, 일련의 트랜잭션은 일부 환경에서 최고의 성능 선택입니다.
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]자세한 정보는
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면