InnoDB의 MVCC는 각 레코드 행 뒤에 두 개의 숨겨진 열을 저장하여 구현됩니다. 이 두 열 중 하나는 행의 생성 시간을 보유하고 다른 하나는 행의 만료 시간(또는 삭제 시간)을 보유합니다. 물론 저장되는 것은 실제 시간 값이 아니라 시스템 버전 번호이다. 새로운 트랜잭션이 시작될 때마다 시스템 버전 번호가 자동으로 증가됩니다. 트랜잭션 시작 시 시스템 버전 번호는 트랜잭션의 버전 번호로 사용되며, 이는 쿼리된 각 레코드 행의 버전 번호와 비교하는 데 사용됩니다. 반복 읽기 격리 수준에서 MVCC가 어떻게 작동하는지 살펴보겠습니다.
InnoDB는 다음 두 가지 조건
a에 따라 각 행 레코드를 확인합니다. InnoDB는 버전이 현재 트랜잭션 버전보다 이전인 데이터 행만 찾습니다(즉, 행의 시스템 버전 번호가 더 낮습니다). 트랜잭션의 시스템 버전 번호 이상), 이는 트랜잭션이 읽은 행이 트랜잭션이 시작되기 전에 이미 존재했거나 트랜잭션 자체에 의해 삽입 또는 수정되었음을 보장합니다.
b. 행의 삭제된 버전이 정의되지 않았거나 현재 트랜잭션 버전 번호보다 큽니다. 이렇게 하면 트랜잭션이 읽은 행이 트랜잭션이 시작되기 전에 삭제되지 않았음을 보장합니다.
위의 두 조건을 만족하는 레코드만 쿼리 결과로 반환될 수 있습니다.
InnoDB는 현재 시스템 버전 번호를 새로 삽입된 각 행의 행 버전 번호로 저장합니다.
InnoDB는 현재 시스템 버전 번호를 삭제된 각 행의 행 삭제 ID로 저장합니다.
InnoDB는 새 레코드 행을 삽입하고 현재 시스템 버전 번호를 행 버전 번호로 저장하며 현재 시스템 버전 번호를 행 삭제 식별자로 원래 행에 저장합니다.
대부분의 읽기 작업을 잠그지 않고 수행할 수 있도록 이 두 개의 추가 시스템 버전 번호를 저장하세요. 이 디자인은 데이터 읽기 작업을 매우 간단하게 만들고 성능도 매우 좋으며 표준을 충족하는 행만 읽도록 보장합니다. 단점은 레코드의 각 행에 추가 저장 공간, 더 많은 행 확인 및 일부 추가 유지 관리 작업이 필요하다는 것입니다.
MVCC는 REPEATABLE READ 및 READ COMMITTED의 두 가지 격리 수준에서만 작동합니다. 다른 두 격리 수준은 READ UNCOMMITTED가 항상 현재 트랜잭션 버전을 따르는 데이터 행이 아닌 최신 데이터 행을 읽기 때문에 MVCC와 호환되지 않습니다. SERIALIZABLE은 읽은 모든 행을 잠급니다.
관련 학습 권장 사항: mysql 데이터베이스
위 내용은 InnoDB MVCC 작동 방식 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!