2010년 12월 26일 일요일

InnoDB MVCC의 개요

Transaction ID
  • 이름 그대로 트랜잭션 식별자이며, Storage 엔진에서 아래와 같이 여러 가지 용도로 사용됨
  • 락 처리에서 어떤 트랜잭션이 락을 가지고 있는지, 또는 데드락 상황에서 강제 종료시킬지
  • Isolation 모드의 결정 및 처리시 (특히 일반적인 MVCC 구현에서, 트랜잭션은 자기 자신의 변경만 볼 수 있으며, 다른 트랜잭션의 변경은 볼 수 없음)
  • 복구 시에 어떤 트랜잭션에 의한 변경인지 또한 최종적으로 Commit/Rollback 여부를 이용하여 Redo log를 적용하고, Undo log를 적용할지 여부 판단

Log Sequence Number (LSN)
  • 로그 파일 내에서 해당 로그 레코드의 위치(주소) 값이며,
  • 일반적으로 로그 레코드 단위로 증가함LSN은 복구 또는 버퍼 관리용으로 많이 사용되며,
  • 체크포인트 발생 시점의 LSN을 관리함으로써 복구 시작 위치로 사용되며,
  • LSN은 트랜잭션 단위로 발생하거나 증가하지 않으며,
  • 로그 파일에는 여러 트랜잭션에서 발생시킨 로그들이 섞여서 저장됨
  • 여러개의 LSN은 하나의 트랜잭션에 포함됨

Snapshot
  • 일반적으로 MVCC에서 어떤 트랜잭션에서 가한 Commit되지 않은 변경은 다른 트랜잭션에서는 볼 수 없으며,
  • 다른 트랜잭션에서는 변경되기 이전의 정보만 볼 수 있도록 구현되는데,
  • 이때 변경되기 이전의 정보를 Undo 로그라고 함이와 같이 어떤 트랜잭션은 트랜잭션의 시작 시점(begin 시점)의 데이터 상태만을 볼 수 있는데, 
  • 이 때 데이터를 사진처럼 찍어서 보여준다는 의미로 Snapshot이라는 표현을 사용하며,
  • 각각의 트랜잭션별로 각각의 다른 Snapshot을 보게 되는데,
  • 이런 각각의 Snapshot들은 여러가지 버전을 가지게 되는데, 이런 것을 Snapshot versioning이라고 표현하기도 한다. (하지만 내부적으로 Snapshot version number가 있는 것은 아님)
  • 이러한 기능들을 위해서, 각각의 레코드 변경은 현재 진행중인 트랜잭션과 해당 트랜잭션의 시점 시점에 의해서 각 레코드의 변경들에 대한 이력 관리를 해야 한다.

MVCC (Multi version concurrency control)
  • MVCC는 Snapshot과 거의 흡사한 개념이며, 일반적으로 레코드 레벨의 트랜잭션을 지원하는 DBMS들이 일반적으로 제공하는 기능이며,
  • MVCC의 가장 큰 목적은 락을 사용하지 않는 일괄된 읽기를 제공하기 위함이며, InnoDB는 이를 위하여 Undo log를 이용하여 이 기능을 제공하고 있음
  • 각각의 레코드에 대해서 변경될 때마다 백업(Undo log)을 남겨서 각 트랜잭션별로 해당 이력에 대한 가시성 판단을 해서 결과를 보여주는 방식을 MVCC라고 한다.

댓글 없음:

댓글 쓰기