TIL

InnoDB MVCC

Undo 영역

InnoDB는 multi-version 스토리지 엔진이다. InnoDB는 일관성과 롤백 같은 트랜잭션 기능을 지원하기 위해 변경된 row에 대한 버전 정보를 언두 영역에 보존한다.

Undo logs

Delete된 row의 물리적 삭제 시점

InnoDB 엔진에서 delete SQL 문에 의해 제거된 row는 물리적으로 바로 삭제되지는 않는다. InnoDB는 이 row와 row의 인덱스 레코드를 delete SQL에 의해 생긴 undo log가 사라질 때 물리적으로 제거한다. (이 작업을 purge라고 함)

InnoDB 버퍼 풀

RDBMS에서 레코드가 insert되거나 update될 때 랜덤 디스크 I/O가 발생한다. 이 때 인덱스가 많다면 자원을 많이 소모해야 하기 때문에 인서트 버퍼를 사용한다.

InnoDB는 변경해야 할 인덱스 페이지가 버퍼 풀에 있으면 바로 update를 수행하지만 버퍼에 없다면 랜덤 디스크 I/O를 즉시 실행하지 않고 버퍼에 저장해 둔 뒤 결과를 반환하며 성능을 향상시킨다.

MVCC (Multi Version Concurrency Control)

락을 사용하지 않고 일관적 읽기를 제공하는 것을 목적으로 하는 DBMS가 제공하는 동시성 제어 기능이다. InnoDB에서는 이를 언두 로그를 이용해 구현하고 있다.

격리 레벨에 따른 특징

동시성 제어 예시

  1. member에 대한 insert 실행
    1. insert undo log가 저장되지만 insert 커밋과 동시에 삭제
    2. insert 버퍼 풀에 insert된 member row가 올라감
    3. 랜덤 디스크 I/O가 발생하여 디스크에도 작업 반영
  2. 이후 member에 대한 update 실행
    1. 버퍼 풀에 바뀐 결과가 반영
    2. update undo log가 생성되어 바뀌기 전 결과를 저장
    3. 디스크에 언제 랜덤 I/O가 일어날지 모르는 상태이지만 InnoDB는 ACID를 보장하기에 일반적으로 버퍼와 디스크의 상태는 동일할 것
    4. 아직 커밋 전
  3. 다른 트랜잭션에서 해당 member row에 대해 select 실행

격리 수준에 따른 다른 결과

참고

https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.html

https://algopoolja.tistory.com/m/115

https://www.youtube.com/watch?v=-kJ3fxqFmqA