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