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