MVCC

MVCC ( Multi-Version Concurrency Control )

image.png

MySQL에서 데이터마다 여러 버전을 두어서 잠금 없이 읽기 작업을 수행할 수 있도록 데이터를 관리하는 방식.

위 그림에서 id가 12인 회원을 수정하기 전 상태를 언두 로그에 복사해둠으로써, 다른 트랜잭션에서 언두 로그의 데이터만 조회하게 한다. 또한 현재 수정하는 id가 12인 멤버는 버퍼풀 메모리에만 수정을 시키고 디스크에는 추후 백그라운드 스레드를 활용해 flush하는 방식으로 총 크게는 3가지 버전의 데이터로 관리한다.

즉, MVCC가 없다면 읽기 작업을 수행할 때마다 수정 작업을 수행 중인 다른 트랜잭션이 없는지 신경 쓰고 잠금을 걸어야하기 때문에 이로인한 성능 이슈로 인해 생긴 것이다.

Undo Log / Read View

언두 로그

image.png

MVCC에서 수정 이전의 데이터를 언두 로그에 백업한다고 했다. 언두 로그를 이처럼 백업을 통해 DB에서 2개의 역할을 수행한다.

image.png

언두 로그는 트랜잭션을 필요할 때만 쓰고 닫아야하는 개념과도 관련있다.

기본적으로 특정 트랜잭션에서 레코드를 조회할 때 자신보다 이전의 트랜잭션이 커밋한 기록까지만 볼 수 있다. 이로인해 장기간 트랜잭션을 열어두고 다시 조회한다면 언두 로그에서 이력을 따라 올라가야 하는 성능상 이슈가 생긴다.

위의 예시 같은 경우에도 트랜잭션 A가 어제 오후 1시에 열리고 오늘 오후 1시에 계속 트랜잭션이 열린 상태에서 다시 조회한다면, 24시간 동안의 해당 레코드가 바뀐 이력을 모두 언두 로그에서 거슬러 올라가며 확인해야 할테다. 결론적으로 트랜잭션을 오래 열어두지 말자 !

READ VIEW와 TRX_ID

언두 로그는 데이터의 이전 기록만 저장하는 역할을 수행한다. 그렇다면 언두 로그에도 데이터 A에 대해서 여러 트랜잭션이 수행한 기록이 있을 때, 어떤 버전을 보여줘야할 지 + 보여주면 안되는 데이터는 무엇일지 정하는 기준이 필요하다. 이를 위해 등장한 것이 READ VIEW이다.

image.png