독자가 때문에PostgreSQL트랜잭션 격리 수준에 관계없이 토토 캔를 잠그지 마십시오. 한 트랜잭션에 의해 읽는 것은 다른 동시에 쓸 수 있습니다. 거래. 다시 말해, 행이에 반환되는 경우select그것이 여전히 행이 여전히 있다는 것을 의미하지는 않습니다 순간에 현재 반환됩니다 (즉, 언젠가 현재 쿼리가 시작되었습니다). 행이 수정되거나 삭제되었을 수 있습니다 이 트랜잭션이 이미 커밋 된 트랜잭션에 의해 시작. 행이 여전히 유효하더라도"지금", 이전에 변경하거나 삭제할 수 있습니다 현재 거래는 커밋 또는 롤백을 수행합니다.
그것에 대해 생각하는 또 다른 방법은 각 거래가 토토 캔베이스 내용의 스냅 샷 및 동시에 실행됩니다 트랜잭션은 다른 스냅 샷을 잘 볼 수 있습니다. 그래서 전체 의 개념"지금"다소 의심됩니다 그래도. 클라이언트가있는 경우 일반적으로 큰 문제가 아닙니다. 응용 프로그램은 서로 격리되지만 고객이 데이터베이스 외부의 채널을 통해 통신 한 다음 심각하게 통신하십시오 혼란이 발생할 수 있습니다.
행의 현재 유효성을 보장하고이를 보호하기 위해 동시 업토토 캔트를 사용해야합니다선택을 선택하십시오 업토토 캔트또는 적절한잠금 테이블진술. (업토토 캔트 선택잠금 동시 업토토 캔트에 대한 반환 된 행,잠금 테이블전체 테이블을 잠그십시오.) 이것이해야합니다 응용 프로그램을 포팅 할 때 고려PostgreSQL다른 환경에서. (전에 버전 6.5PostgreSQL중고 읽기 자물쇠, 따라서 위의 고려 사항은 또한 에서 업그레이드PostgreSQL6.5 이전 버전)
글로벌 타당성 검사에는 추가 사고가 필요합니다MVCC. 예를 들어, 은행 응용 프로그램은 모든 크레딧의 합계를 확인할 수 있습니다. 한 테이블은 둘 다 테이블이 적극적으로 업토토 캔트되고 있습니다. 두 가지 결과를 비교합니다 연속SOLE SUM (...)명령 두 번째 이후로 읽은 커밋 모드에서 안정적으로 작동하지 않습니다. 쿼리는 계산되지 않은 거래 결과가 포함될 것입니다. 첫 번째. 단일 직렬화 가능한 두 합계를 수행합니다 거래는 직렬화 가능한 거래 전에 저지른 거래 시작 ---하지만 답이 정당하게 궁금해 할 수도 있습니다. 전달 될 때까지 여전히 관련이 있습니다. 만약 직렬화 가능한 트랜잭션 자체는 이전에 몇 가지 변경 사항을 적용했습니다 일관성 점검, 수표의 유용성을 만들려고 지금은 더 논쟁의 여지가 있습니다. 이제는 일부를 포함하지만 트랜잭션 이후의 모든 변경 사항이 변경됩니다. 그러한 경우 조심하십시오 사람이 수표에 필요한 모든 테이블을 잠그고 싶을 수도 있습니다. 현재의 현실에 대한 논란의 여지가없는 그림을 얻으려고합니다. 에이공유모드 (또는 더 높은) 잠금 보증 잠긴 테이블에 커밋되지 않은 변경 사항이 없음 현재 거래보다.
예방을 위해 명시 적 잠금에 의존하는 경우 동시 변경, 읽기 커밋 모드 또는 직렬화 가능한 모드 이전에 잠금을 얻기 위해주의하십시오 쿼리 수행. 직렬화 가능한 명시 적 잠금 거래는 다른 거래를 수정하지 않음을 보장합니다 테이블은 여전히 실행 중이지만 트랜잭션은 잠금을 얻는 일치하며 일부는 사전에 걸릴 수 있습니다 이제 테이블의 변경 사항이 있습니다. 직렬화 가능한 트랜잭션 스냅 샷은 실제로 첫 번째 쿼리가 시작될 때 동결되었습니다. 데이터 수정 명령 (select, 삽입, 업토토 캔트, 또는삭제)이므로 얻을 수 있습니다 스냅 샷이 얼기 전에 명시 적 잠금.