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