PostgreSQLSQL 시행 다음을 사용하는 고유성 제약 조건고유 인덱스10243_10370pg_am.amcanunique사실입니다. (현재는 b-tree만 지원합니다.)
MVCC로 인해 항상 중복을 허용해야 합니다. 인덱스에 물리적으로 존재하는 항목: 항목은 다음을 참조할 수 있습니다. 단일 논리적 행의 연속 버전으로. 우리가 하는 행동 실제로 적용하고 싶은 것은 MVCC 스냅샷에 포함될 수 없다는 것입니다. 동일한 인덱스 키를 가진 두 개의 행. 이는 다음과 같이 분류됩니다. 다음과 같은 경우에 새로운 행을 삽입할 때 반드시 확인해야 하는 사항은 다음과 같습니다. 고유한 인덱스로:
충돌하는 유효한 행이 현재에 의해 삭제된 경우 거래, 괜찮아요. (특히 업데이트 이후 새 행 버전을 삽입하기 전에 항상 이전 행 버전을 삭제합니다. 버전을 변경하지 않고 행에 대한 업데이트를 허용합니다. 열쇠.)
충돌하는 행이 삽입된 경우 아직 커밋되지 않은 트랜잭션인 경우 삽입자는 다음을 수행해야 합니다. 해당 트랜잭션이 커밋되는지 확인하기 위해 기다립니다. 롤백되는 경우 그러면 갈등이 없습니다. 삭제하지 않고 커밋하는 경우 행이 다시 충돌하면 고유성 위반이 발생합니다. (에서 연습하면 다른 트랜잭션이 끝날 때까지 기다리면 됩니다. 그런 다음 가시성 확인을 다시 실행하세요.)
마찬가지로, 충돌하는 유효한 행이 다음에 의해 삭제된 경우 아직 커밋되지 않은 트랜잭션인 경우 삽입자는 다음을 수행해야 합니다. 해당 트랜잭션이 커밋되거나 중단될 때까지 기다린 다음 반복합니다. 시험.
또한 고유성 위반을 제기하기 직전 위의 규칙에 따라 액세스 방법은 다음을 다시 확인해야 합니다. 삽입되는 행의 활성 상태입니다. 그것이 죽은 것으로 커밋되면 오류가 발생해서는 안 됩니다. (이런 경우는 해당 기간 동안에는 발생할 수 없습니다. 방금 생성된 행을 삽입하는 일반적인 시나리오 현재 거래. 다음 중에 발생할 수 있습니다.동시에 고유 인덱스 생성그러나.)
이 테스트를 적용하려면 색인 액세스 방법이 필요합니다 즉, 힙에 접근하여 확인해야 함을 의미합니다. 중복된 키가 있는 것으로 표시된 행의 커밋 상태 색인 내용에 따라. 이것은 의심할 여지없이 추악하고 모듈화되지 않았지만 중복된 작업을 줄여줍니다. 조사하면 충돌하는 행에 대한 인덱스 조회는 다음과 같습니다. 새 항목을 삽입할 위치를 찾는 동안 본질적으로 반복됩니다. 행의 인덱스 항목. 게다가 피할 수 있는 확실한 방법도 없습니다. 충돌 검사가 필수적인 부분이 아닌 한 경쟁 조건 새 색인 항목을 삽입합니다.
이 계획의 주요 제한은 지연된 고유성 검사를 지원하는 편리한 방법입니다.