본문 바로가기

CS/Database

MySQL의 MVCC(Multi Version Concurrency Control)

MVCC의 가장 큰 목적은 잠금(락)을 사용하지 않는 일관된 읽기를 제공하는 데 있다. 그리고 InnoDB는 언두 로그(Undo log)를 통해 이 기능을 구현한다.

 

예제를 통해 MVCC가 어떻게 동작하는지 알아보자. 만약 트랜잭션 1이 데이터를 조회해와서 값을 변경("서울" -> "경기")했으며 아직 커밋하지 않은 상태라고 가정하자. 데이터를 변경하면, 커밋 여부와 상관없이 InnoDB 버퍼 풀에 변경된 데이터가 반영된다. 그리고 변경 전의 데이터는 언두 영역에 보관된다.

이때 트랜잭션 2가 해당 데이터를 조회하면 어떤 데이터가 조회될까? 이는 설정한 트랜잭션 격리 수준에 따라 다르다.

  • READ_UNCOMMITTED: InnoDB 버퍼 풀이 현재 가지고 있는 변경된 데이터("경기")를 반환한다.
  • READ_UNCOMMITTED 이상의 격리 수준: 아직 커밋되지 않았기 때문에 InnoDB 버퍼 풀이나 데이터 파일에 있는 내용 대신 변경 전의 데이터를 보관하고 있는 언두 영역의 데이터를 반환한다. 

만약 이 상태에서 트랜잭션 1이 커밋하면 InnoDB 버퍼 풀은 더 이상의 변경 작업 없이 지금의 상태를 영구적인 데이터로 만들어 버린다. 그러나 트랜잭션 1이 롤백하면 InnoDB의 언두 영역에 백업된 데이터를 InnoDB 버퍼 풀로 다시 복구하고 언두 영역의 내용을 삭제한다.

 

이러한 과정을 MVCC라고 한다. 즉, 하나의 레코드에 대해 2개의 버전이 관리되고 필요에 따라 어느 데이터가 보여지는지 여러 상황에 따라 달라진다. 언두 영역을 통해 MVCC는 잠금 없이 일관된 읽기를 제공할 수 있다.


Reference

  • 위키북스, Real MySQL 8.0