MVVC 가 뭐야 ?
MVCC (Multi-Version Concurrency Control)는 데이터베이스 관리 시스템(DMS)에서 동시성 제어를 위해 사용하는 방법입니다. MVCC를 통해 여러 트랜잭션들이 동시에 같은 데이터에 접근하더라도 일관성을 유지할 수 있게 됩니다.
MVCC를 사용하면 각각의 SQL 문은 트랜잭션 시작 시점의 데이터 스냅샷에 대해 동작합니다. 즉, 한 트랜잭션 내의 SQL 문들은 같은 데이터 스냅샷을 보게 되며, 트랜잭션 도중 다른 트랜잭션에 의한 변경 내용이 반영되지 않습니다. 이를 통해 각 트랜잭션이 독립적으로 수행되는 것처럼 만듭니다.
MVCC는 트랜잭션 격리 수준이 "Read Committed" 또는 "Repeatable Read"일 때 가장 유용합니다. 이는 트랜잭션 도중 다른 트랜잭션에서 수행된 변경 작업이 현재 트랜잭션에 영향을 미치지 않도록 함으로써, 트랜잭션의 일관성을 보장하는 데 사용됩니다.
MySQL의 InnoDB 스토리지 엔진에서는 MVCC를 지원합니다. 이를 통해 여러 트랜잭션이 동시에 수행되더라도, 데이터의 일관성을 보장하면서 동시성을 향상시키는 것이 가능해집니다.
그러나 MVCC를 사용하면 여러 버전의 데이터를 유지 관리해야 하므로, 데이터베이스 시스템에 부가적인 오버헤드가 발생합니다. 따라서 MVCC를 사용하는 데이터베이스에서는 가비지 컬렉션과 같은 방법을 사용하여 불필요한 데이터 버전을 정리하는 작업이 필요합니다.
테이블을 생성하고 insert , commit 을 하였다.
이후
update member set m_are = '경기' where id = 12 ;
하게 되면 ,
커밋여부와 상관없이 , InnoDB 의 버퍼풀은 새로운 값인 경기로 업데이트가 된다.
아직 commit 을 하지않았을때 ,
select * from member where id = 12 ;
하게되면
뭐가 출력이 될까 ?
MySQL 서버의 시스템 변수( transaction_isolation )에 설정된 격리 수준(Isolation
level)에 따라 다르다는 것이다. 격리 수준이 READ_UNCOMMITTED 인 경우에는 InnoDB 버퍼 풀이 현재 가지고 있는 변경된 데이터를 읽어서 반환한다. 즉, 데이터가 커밋됐든 아니든 변경된 상태의 데이터를 반환한다. 그렇지 않고 READ_COMMITTED 나 그 이상의 격리 수준( REPEATABLE_READ , SERIALIZABLE )인 경우 에는 아직 커밋되지 않았기 때문에 InnoDB 버퍼 풀이나 데이터 파일에 있는 내용 대신 변경되기 이전의 내용을 가져오게 된다.
"Real MySQL 8.0 (1권)"중에서
교보eBook에서 자세히 보기:
https://ebook-product.kyobobook.co.kr/dig/epd/ebook/4801158392704