2025년 9월 25일:토토 커뮤니티 : 토토
이 문서는 지원되지 않는 윈 토토 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 62.5. 토토 꽁 머니 고유성 점검버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

52.5. 윈 토토 고유성 검사

윈 토토SQL 시행 다음을 사용하는 고유성 제약 조건고유 윈 토토10260_10387pg_am.amcanunique그렇습니다. (현재는 b-tree만 지원합니다.)

MVCC로 인해 항상 중복을 허용해야 합니다. 인덱스에 물리적으로 존재하는 항목: 항목은 다음을 참조할 수 있습니다. 단일 논리적 행의 연속 버전으로. 우리가 하는 행동 실제로 시행하고 싶은 것은 MVCC 스냅샷에 포함될 수 없다는 것입니다. 동일한 인덱스 키를 가진 두 개의 행. 이는 다음과 같이 분류됩니다. 다음과 같은 경우에 새로운 행을 삽입할 때 반드시 확인해야 하는 사항은 다음과 같습니다. 고유한 인덱스로:

  • 충돌하는 유효한 행이 현재에 의해 삭제된 경우 거래, 괜찮아요. (특히 업데이트 이후 새 행 버전을 삽입하기 전에 항상 이전 행 버전을 삭제합니다. 버전을 변경하지 않고 행에 대한 업데이트를 허용합니다. 열쇠.)

  • 충돌하는 행이 다음에 의해 삽입된 경우 아직 커밋되지 않은 트랜잭션인 경우 삽입자는 다음을 수행해야 합니다. 해당 트랜잭션이 커밋되는지 확인하기 위해 기다립니다. 롤백되는 경우 그러면 갈등이 없습니다. 삭제하지 않고 커밋하는 경우 행이 다시 충돌하면 고유성 위반이 발생합니다. (에서 연습하면 다른 트랜잭션이 끝날 때까지 기다리면 됩니다. 그런 다음 가시성 확인을 다시 실행하세요.)

  • 마찬가지로, 충돌하는 유효한 행이 다음에 의해 삭제된 경우 아직 커밋되지 않은 트랜잭션인 경우 삽입자는 다음을 수행해야 합니다. 해당 트랜잭션이 커밋되거나 중단될 때까지 기다린 다음 반복합니다. 시험.

또한 고유성을 보고하기 직전 위의 규칙에 따라 위반하는 경우 액세스 방법은 다음과 같습니다. 삽입되는 행의 활성 상태를 다시 확인하세요. 그렇다면 사망한 경우 위반 사항을 보고해서는 안 됩니다. (이 사건은 행을 삽입하는 일반적인 시나리오에서는 발생할 수 없습니다. 이는 현재 트랜잭션에 의해 생성된 것입니다. 그것은 할 수 있다 중에 발생함고유 윈 토토 생성 동시에하지만.)

이 테스트를 적용하려면 색인 액세스 방법이 필요합니다 즉, 힙에 접근하여 확인해야 함을 의미합니다. 중복된 키가 있는 것으로 표시된 행의 커밋 상태 색인 내용에 따라. 이것은 의심할 여지없이 추악하고 모듈화되지 않았지만 중복된 작업을 줄여줍니다. 조사하면 충돌하는 행에 대한 인덱스 조회는 다음과 같습니다. 새 항목을 삽입할 위치를 찾는 동안 본질적으로 반복됩니다. 행의 인덱스 항목. 게다가 피할 수 있는 확실한 방법도 없습니다. 충돌 검사가 필수적인 부분이 아닌 한 경쟁 조건 새 색인 항목을 삽입합니다.

고유 제약 조건이 연기 가능한 경우 추가 복잡성: 새로운 항목에 대한 색인 항목을 삽입할 수 있어야 합니다. 행이 끝날 때까지 고유성 위반 오류를 연기합니다. 성명 또는 그 이후. 불필요한 반복 검색을 피하기 위해 인덱스, 인덱스 액세스 방법은 예비 작업을 수행해야 합니다 초기 삽입 중 고유성 검사. 이것이 그것을 보여준다면 확실히 충돌하는 라이브 튜플이 없습니다. 끝났습니다. 그렇지 않은 경우에는 재확인이 필요할 때 다시 확인하도록 예약합니다. 제약조건을 시행합니다. 재검사 당시 두 가지 모두에 해당하는 경우 삽입된 튜플과 동일한 키를 가진 다른 튜플이 활성화되어 있습니다. 그런 다음 오류를 보고해야 합니다. (이 목적을 위해 참고하세요."실시간"실제로는 의미합니다"색인 항목의 HOT 체인에 있는 모든 튜플은 라이브".) 이를 구현하려면,아민서트함수가 전달되었습니다.checkUnique다음 중 하나를 갖는 매개변수 값:

  • UNIQUE_CHECK_NO아니요를 나타냅니다. 고유성 검사를 수행해야 합니다(이것은 고유한 것이 아닙니다). 색인).

  • UNIQUE_CHECK_YES다음을 나타냅니다. 이는 지연할 수 없는 고유 인덱스이며 고유성은 위에서 설명한 대로 확인을 즉시 수행해야 합니다.

  • UNIQUE_CHECK_PARTIAL표시 고유 제약 조건은 연기 가능합니다.포스트그레SQL이 모드를 사용하여 삽입합니다 각 행의 인덱스 항목. 액세스 방법은 다음을 허용해야 합니다. 항목을 색인에 복제하고 잠재적인 가능성을 보고합니다. FALSE를 반환하여 중복됨아민서트. FALSE가 있는 각 행에 대해 반환된 경우 연기된 재검사가 예정됩니다.

    액세스 방법은 다음과 같은 행을 식별해야 합니다. 고유 제약 조건을 위반했지만 오류는 아닙니다. 오탐지를 보고합니다. 이렇게 하면 검사가 완료됩니다. 다른 거래가 완료될 때까지 기다리지 않고 갈등 여기에 보고된 내용은 오류로 처리되지 않고 다시 확인됩니다. 나중에 더 이상 충돌이 발생하지 않을 수 있습니다.

  • UNIQUE_CHECK_EXISTING표시 이는 다음과 같이 보고된 행에 대한 지연된 재검사입니다. 잠재적인 고유성 위반. 비록 이것이 호출로 구현됨아민서트, 액세스 방법은 다음과 같습니다아님새 항목 삽입 이 경우 인덱스 항목입니다. 색인 항목이 이미 존재합니다. 오히려 액세스 방법은 다음이 있는지 확인해야 합니다. 또 다른 라이브 인덱스 항목. 그렇다면 대상 행이 아직 살아있습니다. 오류를 신고하세요.

    다음을 권장합니다.UNIQUE_CHECK_EXISTING호출, 액세스 방법 추가로 대상 행에 실제로 윈 토토에 기존 항목이 있으면 오류를 보고합니다. 이것은 윈 토토 튜플 값이 전달되기 때문에 좋은 생각입니다.아민서트이었을 것입니다 다시 계산되었습니다. 인덱스 정의에 다음과 같은 함수가 포함된 경우 실제로는 변경할 수 없습니다. 잘못된 영역을 확인하고 있을 수 있습니다. 인덱스의. 대상 행이 발견되었는지 확인 재검사는 동일한 튜플을 스캔하고 있는지 확인합니다. 원래 삽입에 사용된 값입니다.