반응형
💋 MVCC(Multi Version Concurrency Control)
- 레코드 레벨의 트랜잭션을 지원하는 DBMS가 제공하는 기능
- 배타적인 락을 사용하지 않으면서, 일관된 읽기를 제공하기 위한 목적
- 하나의 레코드에 대해 여러 개의 버전(Multi Version)이 동시에 관리됨.
- InnoDB는 언두 로그(Undo log)를 사용해 MVCC를 구현함.
💋 언두 로그(Undo log)
- 트랜잭션 격리 수준 READ COMMITTED라고 가정
- CREATE문을 통해 데이터베이스 내에 테이블은 이미 존재한다고 가정
✔ 예시를 통한 언두 로그 설명
1. INSERT INTO MEMBER (m_id, m_name, m_area) VALUES (12, '홍길동', '서울'); 실행하고 커밋함.
2. UPDATE member SET m_area='경기' WHERE m_id=12; 실행하고 커밋하지 않음.
- UPDATE문이 실행되면, 커밋 여부와 관계없이 InnoDB 버퍼 풀은 최신 값 '경기'로 업데이트
✔ 다른 트랜잭션에서의 조회는 언두로그와 InnoDB 버퍼 풀 중 어느 곳의 데이터를 가져올까?
이 상태에서 다른 트랜잭션에서 SELECT * FROM member WHERE m_id=12; 실행한다면?
- 해당 쿼리로 작업 중인 레코드를 조회하면 어디에 있는 데이터가 조회될까?
- MySQL 서버의 시스템 변수에 설정된 격리 수준에 따라 다르다!
- READ UNCOMMITTED - InnoDB 버퍼 풀의 현재 값 반환 (=경기)
- READ COMMITTED 이상 - 언두 로그의 데이터 반환 (=서울)
- 아직 커밋되지 않았기 때문
✔ 언두 로그의 데이터는 몇 개까지 가능할까?
- 위의 예시에서는 2개의 버전만 유지하지만, 관리해야 하는 예전 버전의 데이터는 무한히 많아질 수 있음.
- 트랜잭션이 길어지면, 언두에서 관리해야 하는 예전 데이터가 삭제되지 못하고 오랫동안 관리해야 함.
- 언두 영역에서 저장하는 데이터 공간이 많이 늘어나는 상황이 발생할 수 있음.
✔ UPDATE 쿼리 실행 시 언두로그의 동작 방식
- UPDATE 쿼리가 실행되면, InnoDB 버퍼 풀은 즉시 업데이트되고, 기존 데이터는 언두 영역으로 복사
- COMMIT을 실행하면, InnoDB는 현재 상태를 영구 데이터로 만듦.
- 언두 영역의 백업 데이터를 필요로 하는 트랜잭션이 없어진 후에 언두 영역 데이터를 삭제함.
- ROLLBACK을 실행하면, InnoDB는 언두 영역에 백업된 데이터를 InnoDB 버퍼 풀로 복구하고, 언두 영역의 내용을 삭제함.
- COMMIT을 실행하면, InnoDB는 현재 상태를 영구 데이터로 만듦.
💋 참고자료
- Real MySQL 8.0 1편 4.2.3
도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
반응형
'MySQL' 카테고리의 다른 글
[MySQL] 디스크 I/O: 하드 디스크 드라이브(HDD) VS 솔리드 스테이트 드라이브(SSD), 데이터베이스 성능 튜닝은 디스크 I/O를 줄이는 것이 관건! (0) | 2023.08.30 |
---|---|
[MySQL] 트랜잭션의 격리수준: 이상 현상(Dirty Read, Non-Repeatable Read, Phantom Read)의 정의 (2) | 2023.08.30 |
[MySQL] MySQL 엔진의 락 (Lock) (0) | 2023.08.15 |
[MySQL] MySQL 아키텍처: 접속 클라이언트, MySQL 엔진, 스토리지 엔진, 운영 체제, 하드웨어 (0) | 2023.08.14 |
[MySQL] 트랜잭션: 트랜잭션의 개념, 주의사항, 트랜잭션 VS 락 (Real MySQL 8.0) (0) | 2023.08.13 |