왜냐하면 독자들이포스트그레SQL트랜잭션 격리 수준, 데이터에 관계없이 데이터를 잠그지 마세요. 한 트랜잭션이 읽은 내용을 다른 트랜잭션이 동시에 덮어쓸 수 있음 거래. 즉, 행이에 의해 반환되는 경우선택행이 아직 남아 있다는 의미는 아닙니다. 반환되는 순간 현재 상태입니다(즉, 현재 쿼리가 시작되었습니다). 행이 수정되었거나 삭제되었을 수 있습니다. 이 트랜잭션 이후에 커밋된 이미 커밋된 트랜잭션에 의해 시작되었습니다. 행이 여전히 유효한 경우에도"지금", 이전에 변경되거나 삭제될 수 있습니다. 현재 트랜잭션이 커밋 또는 롤백을 수행합니다.
생각하는 또 다른 방법은 각 거래가 데이터베이스 내용의 스냅샷 및 동시에 실행 트랜잭션은 다른 스냅샷을 볼 수 있습니다. 그래서 전체 의 개념"지금"다소 의심스럽습니다 어쨌든. 클라이언트가 다음과 같은 경우 이는 일반적으로 큰 문제가 되지 않습니다. 애플리케이션은 서로 격리되어 있지만 클라이언트가 데이터베이스 외부 채널을 통해 통신한 후 심각함 혼란이 생길 수 있습니다.
행의 현재 유효성을 확인하고 이를 방지하기 위해 동시 업데이트를 사용해야 함선택 대상 업데이트또는 적절한락 테이블성명. (업데이트를 위해 선택잠금 동시 업데이트에 대해 반환된 행, 반면락 테이블테이블 전체를 잠급니다.) 이는 다음과 같아야 합니다. 애플리케이션을 다음으로 포팅할 때 고려됨포스트그레SQL다른 환경에서.
참고:버전 6.5 이전포스트그레SQL읽기 잠금을 사용했기 때문에 위의 고려 사항은 다음에서 업그레이드하는 경우에도 마찬가지입니다.토토 사이트 순위이전 버전 6.5.
전역 유효성 검사에는 MVCC에 대한 추가 고려가 필요합니다. 에 대한 예를 들어, 은행 애플리케이션은 합계를 확인하려고 할 수 있습니다. 한 테이블의 모든 크레딧은 다른 테이블의 차변 합계와 같습니다. 두 테이블이 모두 활발하게 업데이트되는 경우. 비교 두 번의 연속 결과선택 합계(...)명령은 읽기 모드에서 안정적으로 작동하지 않습니다. 커밋 모드(두 번째 쿼리에는 다음이 포함될 가능성이 높음) 첫 번째로 계산되지 않은 거래 결과. 둘이서 하는거 단일 직렬화 가능 트랜잭션의 합계는 정확한 결과를 제공합니다. 이전에 커밋된 트랜잭션의 효과에 대한 그림 직렬화 가능 트랜잭션이 시작되었지만 합법적으로 그 대답이 그 시점까지 여전히 관련성이 있는지 궁금합니다. 배달되었습니다. 직렬화 가능 트랜잭션 자체가 일부를 적용한 경우 일관성 확인을 시도하기 전에 변경 사항을 수표의 유용성은 더욱 논쟁의 여지가 있습니다. 거래 시작 후 변경 사항 중 일부가 포함되지만 전부는 아닙니다. 그런 주의 깊은 사람이 필요한 모든 테이블을 잠그고 싶어하는 경우 현재의 확실한 그림을 얻기 위해 수표 현실. 갑공유모드(또는 그 이상) 잠금 잠긴 항목에 커밋되지 않은 변경 사항이 없음을 보장합니다. 현재 거래의 테이블이 아닌 테이블입니다.
또한 방지하기 위해 명시적 잠금에 의존하는 경우에도 주의하세요. 동시 변경이 있는 경우 Read Committed 모드를 사용해야 합니다. 직렬화 가능 모드는 잠금을 획득하기 전에 주의해야 합니다. 쿼리를 수행합니다. 직렬화 가능에서 얻은 명시적 잠금 트랜잭션은 해당 트랜잭션을 수정하는 다른 트랜잭션이 없음을 보장합니다. 테이블은 여전히 실행 중입니다. --- 하지만 스냅샷이 트랜잭션은 잠금을 획득하기 이전에 발생하며 일부 이전에 발생할 수 있습니다. 현재 커밋된 변경 사항이 테이블에 표시됩니다. 직렬화 가능한 트랜잭션 스냅샷은 실제로 첫 번째 쿼리 시작 시 고정됩니다. (선택, 삽입, 업데이트또는삭제)이므로 다음을 얻을 수 있습니다. 스냅샷이 고정되기 전의 명시적인 잠금입니다.