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