이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.와이즈 토토 : 문서 : 17 : 62.4. 색인 잠금 고려 사항버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

54.4. 윈 토토 잠금 고려사항

윈 토토 액세스 방법은 윈 토토의 동시 업데이트를 처리해야 합니다. 여러 프로세스를 통해 핵심PostgreSQL시스템 획득액세스공유잠금윈 토토 스캔 중 윈 토토에 대해, 그리고RowExclusiveLock업데이트할 때 색인(일반 포함)진공). 이후 이러한 잠금 유형은 충돌하지 않으며 액세스 방법에 따라 달라집니다. 필요할 수 있는 세부적인 잠금을 처리하기 위해. 독점 윈 토토 전체에 대한 잠금은 윈 토토 중에만 수행됩니다. 생성, 파괴 또는REINDEX.

일반적으로 동시 업데이트를 지원하는 인덱스 유형 구축 필요한 동작에 대한 광범위하고 미묘한 분석이 필요합니다. b-트리 및 해시 인덱스 유형의 경우 디자인에 대해 읽을 수 있습니다. 관련된 결정src/백엔드/액세스/nbtree/README그리고src/백엔드/액세스/해시/README.

색인 자체의 내부 일관성 요구 사항 외에도, 동시 업데이트는 상위 테이블() 및 색인입니다. 왜냐면포스트그레SQL별도 인덱스에서 힙에 대한 액세스 및 업데이트에는 다음이 있습니다. 인덱스가 힙과 일치하지 않을 수 있는 창. 우리 다음 규칙에 따라 이 문제를 처리하세요.

  • 색인 항목을 만들기 전에 새로운 힙 항목이 만들어졌습니다. (따라서 동시 인덱스 스캔은 힙 항목. 색인 판독기는 다음과 같기 때문에 괜찮습니다. 어쨌든 커밋되지 않은 행에는 관심이 없습니다. 하지만 보세요섹션 54.5.)

  • 힙 항목이 삭제될 때(by진공), 해당 색인 항목을 모두 제거해야 합니다. 먼저.

  • 색인 스캔은 색인 페이지에 핀을 유지해야 합니다. 마지막으로 반환한 항목:amgettupleambulkdelete항목을 삭제할 수 없습니다. 다른 백엔드에 의해 고정된 페이지에서. 이에 대한 필요성 규칙은 아래에 설명되어 있습니다.

세 번째 규칙이 없으면 색인 리더는 다음을 수행할 수 있습니다. 다음에 의해 제거되기 직전의 색인 항목을 참조하세요.진공, 해당 힙에 도달 그 이후의 항목은 다음에 의해 제거되었습니다.진공. 해당 항목 번호가 여전히 남아 있으면 심각한 문제가 발생하지 않습니다. 리더가 도달하면 사용되지 않습니다. 빈 항목 슬롯은 에 의해 무시됨heap_fetch(). 하지만 만약에 세 번째 백엔드가 이미 아이템 슬롯을 어떤 용도로 재사용했습니다. 그렇지 않으면? MVCC 호환 스냅샷을 사용하면 문제가 없습니다. 슬롯의 새로운 점유자는 너무 새로운 것이 확실하기 때문에 스냅샷 테스트를 통과하세요. 그러나 MVCC를 준수하지 않는 스냅샷의 경우 (예:SnapshotNow), 그럴 겁니다. 실제로 일치하지 않는 행을 수락하고 반환하는 것이 가능합니다. 스캔 키. 우리는 다음을 요구함으로써 이 시나리오를 방어할 수 있습니다. 모든 경우에 힙 행에 대해 키를 다시 검사해야 하지만 그건 너무 비싸요. 대신에 우리는 색인 페이지에 핀을 사용합니다. 독자가 아직 있을 수 있음을 나타내는 프록시"비행 중"색인 항목부터 일치 항목까지 힙 항목. 만들기ambulkdelete차단 그러한 핀에서는 다음을 보장합니다.진공할 수 없습니다 리더가 작업을 완료하기 전에 힙 항목을 삭제합니다. 이 솔루션은 런타임 비용이 거의 들지 않으며 차단 오버헤드만 추가합니다. 실제로 충돌이 발생하는 드문 경우입니다.

이 솔루션을 사용하려면 색인 스캔이 필요합니다."동기식": 각 힙 튜플을 가져와야 합니다. 해당 윈 토토 항목을 스캔한 직후. 이것은 여러 가지 이유로 비싸다. 안"비동기"많은 TID를 수집하는 스캔 인덱스에서 나중에 언젠가 힙 튜플을 방문합니다. 훨씬 적은 인덱스 잠금 오버헤드가 필요하며 더 많은 작업을 허용할 수 있습니다. 효율적인 힙 액세스 패턴. 위의 분석에 따라 우리는 다음을 사용해야 합니다. MVCC를 준수하지 않는 스냅샷에 대한 동기식 접근 방식이지만 MVCC를 사용하는 쿼리에 대해 비동기 스캔이 가능합니다. 스냅샷.

안에amgetbitmap색인 스캔, 액세스 방법은 반환된 항목에 색인 핀을 유지하지 않습니다. 튜플. 따라서 이러한 스캔을 사용하는 것은 다음과 같은 경우에만 안전합니다. MVCC 호환 스냅샷.

ampredlocks플래그가 아님 설정, 직렬화 가능 내에서 해당 인덱스 액세스 방법을 사용하는 모든 스캔 트랜잭션은 전체에 대해 비차단 조건자 잠금을 획득합니다. 색인. 이렇게 하면 다음 항목을 삽입할 때 읽기-쓰기 충돌이 발생합니다. 동시 직렬화 가능 트랜잭션을 통해 해당 인덱스에 튜플을 추가합니다. 특정 패턴의 읽기-쓰기 충돌이 감지된 경우 동시 직렬화 가능 트랜잭션 세트 중 하나 데이터 무결성을 보호하기 위해 거래가 취소될 수 있습니다. 때 플래그가 설정되면 인덱스 액세스 방법이 다음을 구현함을 나타냅니다. 더 세분화된 조건자 잠금으로 인해 그러한 거래 취소 빈도.