MVCC(다중 버전 동시성 제어)는 동시성 제어 기술입니다. 데이터베이스 동시성 제어를 구현하는 MVVC는 여러 버전의 데이터 행을 유지 관리하여 수행되는 실행 취소 로그의 버전 체인과 분리될 수 없습니다.
간단히 말하면, 현재 트랜잭션은 다른 트랜잭션에 의해 변경되는 행을 쿼리합니다. (이때 읽으면 더티 읽기가 발생합니다.) 잠그고 기다리는 대신 데이터의 기록 버전을 읽어 응답 시간을 줄입니다.
MVVC는 실행 취소 로그와 읽기 보기라는 두 가지 기술을 통해 구현됩니다.
2. 스냅샷 읽기 및 현재 읽기
MySQL InnoDB에서 MVCC 구현은 주로 데이터베이스 동시성 성능을 향상하고 읽기-쓰기 충돌을 처리하는 더 나은 방법을 사용하므로 읽기-쓰기 충돌이 있는 경우에도 잠금 없음, 비차단 동시 읽기, 이 읽기는 현재 읽기가 아닌 스냅샷 읽기를 나타냅니다. 현재 읽기는 실제로 잠금 작업입니다.
1. 현재 읽기
읽은 기록이 최신 데이터인지 확인하고 다른 동시 트랜잭션이 기록을 수정하는 것을 방지하려면 읽을 때 기록을 잠가야 합니다.
잠긴 읽기를 현재 읽기라고 하며, 데이터의 추가, 삭제, 수정을 먼저 읽어야 합니다. 이 읽기 프로세스도 현재 읽기입니다.
SELECT * FROM t LOCK IN SHARE MODE; # 共享锁
SELECT * FROM t FOR UPDATE; # 排他锁
UPDATE SET t..
로그인 후 복사
2. 스냅샷 읽기
스냅샷 읽기는 데이터 행의 스냅샷 버전을 읽습니다. MySQL에서 일반 select 문(공유 모드에서 업데이트나 잠금이 없는 select 문)은 기본적으로 잠금 없이 스냅샷 읽기를 사용합니다.
SELECT * FROM table WHERE ...
로그인 후 복사
그 이유는 스냅샷을 읽으면 작업 잠금을 방지하고 오버헤드를 줄일 수 있기 때문입니다.
트랜잭션의 격리 수준이 직렬인 경우 스냅샷 읽기는 쓸모가 없으며 현재 읽기 수준으로 저하됩니다.
3. 격리 수준 및 버전 체인 검토
격리 수준:
MySQL의 기본 격리 수준은 반복 불가능 읽기 문제를 해결할 수 있는 반복 읽기 RR입니다. MySQL에서는 팬텀 읽기 문제 해결도 지원합니다. .
환상 독서 문제를 어떻게 해결하나요? 두 가지 방법이 있습니다:
문제를 해결하려면 갭 잠금 및 임시 키 잠금을 사용하십시오. 즉, 이 기간 동안 다른 트랜잭션은 데이터를 삽입할 수 없습니다.
MVCC 방법, 잠금이 필요하지 않음, 낮은 소비. (단점 팬텀리딩 문제를 완전히 해결하지 못한다).
실행 취소 로그 버전 체인:
InnoDB에 해당하는 클러스터형 인덱스의 각 레코드에는 두 개의 필수 숨겨진 필드가 포함됩니다.
trx_id: 트랜잭션이 특정 클러스터형 인덱스에 적용될 때마다 레코드가 수정되면 해당 거래의 거래 ID는 trx_id 숨겨진 열에 할당됩니다.
roll_pointer: 롤백 포인터. 데이터가 수정될 때마다 이전 데이터가 실행 취소 로그에 저장됩니다. 이 포인터 필드를 롤백 포인터라고 합니다. , 이 포인터를 통해 수정 전의 데이터를 확인할 수 있습니다.
예:
ID 8의 트랜잭션이 데이터 조각을 생성한 후 레코드의 다이어그램은 대략 다음과 같습니다.
ID 10과 20의 두 트랜잭션이 각각 이 레코드를 수행한다고 가정합니다. 작업 과정은 다음과 같습니다: