MVCC (Multi Version Concurreny Control)
목적
- 잠금없이 동시성을 높이면서 일관된 읽기를 제공하기 위해 사용한다.
- Mutli Version 다중 버전의 레코드가 읽게 된.
- 격리 수준에 따라 레코드가 어떻게 읽힐 지가 결정된다.
예시
CREATE TABLE memberTbl(
member_id INT NOT NULL AUTOINCREMENT PRIMARY KEY,
member_name VARCHAR(24) NOT NULL,
join_date DATE NOT NULL
);
INERT INTO memberTbl(member_id, member_name, join_date) VALUES(1, 'John', '2022-05-01');
COMMIT;
위 연산의 실행 결과는 다음과 같다.
다음 UPDATE 구문을 실행한 뒤 결과는 다음과 같다.
UPDATE memberTbl SET member_name = 'chris' WHERE member_id = 1;
연산의 결과가 데이터 파일로 동기화됌 여부는 현 시점에서 알 수 가 없다. 디스크로 동기화하는 Write 쓰레드가 따로 존재하며 주기마다 InnoDb 버퍼 풀 상태로 동기화한다.
UPDATE 연산이 발생하면 기존의 레코드 상태를 언두 로그에 기록한다.
SELECT * FROM memberTbl WHERE member_id = 1;
다시 memberTbl 테이블에서 member_id가 1인 레코드를 읽게 되면 어떤 레코드가 읽힐 것 인지는 격리 수준에 따라 달라진다.
READ_UNCOMMITTED : COMMIT이 이루어지지 않았더라도 항상 InnoDb 버퍼 풀 데이터를 참조하여 데이터를 읽게된다.
READ_COMMITTED 이상의 격리수준 : 항상 COMMIT된 레코드만 읽게되므로 아직 COMMIT이 이루어지지 않은 상태를 읽기 위해 언두 로그를 참조하여 변경 전의 레코드를 읽게 된다.
여기서 COMMIT을 실행하면 변경 결과가 영원히 반영되며 ROLLBACK을 실행했을 경우 언두 로그의 기록을 보고 다시 변경 상태를 되돌리게 된다.
잠금없는 일관된 읽기
InnoDB 엔진은 MVCC 기술을 이용하여 잠금을 걸지 않고 읽기 작업을 수행하게 된다.
이를 '잠금 없는 일관된 읽기' 라고 표현하며 InnoDB에서는 변경되기 전의 데이터를 읽기 위해 언두 로그를 사용한다.
'DB > MySQL' 카테고리의 다른 글
MySQL 실행 계획 (0) | 2022.06.12 |
---|---|
MySQL 옵티마이저와 힌트 (0) | 2022.05.08 |
MySQL 인덱스 (0) | 2022.01.09 |
MySQL 트랜잭션과 잠금 (0) | 2022.01.02 |
MySQL InnoDB 스토리지 엔진 아키텍처 (0) | 2021.12.30 |