MVCC

2020. 6. 26. 14:59DB

728x90

동시성 제어

 동시성 제어란 DBMS가 다수의 사용자 사이에서 동시에 작용하는 다중 트랜잭션의 상호간섭 작용에서 Database를 보호하는 것을 의미합니다. 일반적으로 동시성을 허용하면 일관성이 낮아지게 되며 이를 그래프로 나타내면 아래와 같습니다.


 다수 사용자의 동시 접속을 위해 DBMS는 동시성 제어를 할 수 있도록 Lock 기능과 SET TRANSACTION 명령어를 이용해 트랜잭션의 격리성 수준을 조정할 수 있는 기능도 제공합니다. 이렇게 동시성을 제어하는 방법에는 비관적 동시성 제어와 낙관적 동시성 제어가 있습니다.


비관적 동시성 제어

  • 사용자들이 같은 데이터를 동시에 수정할 것이라고 가정
  • 데이터를 읽는 시점에 Lock을 걸고, 트랜잭션이 완료될 때까지 이를 유지
  • SELECT 시점에 Lock을 거는 비관적 동시성 제어는 시스템의 동시성을 심각하게 떨어뜨릴 수 있어서 wait 혹은 nowait 옵션과 함께 사용해야함

낙관적 동시성 제어

  • 사용자들이 같은 데이터를 동시에 수정하지 않을 것이라고 가정
  • 데이터를 읽는 시점에 Lock을 걸지 않는 대신 수정 시점에 값이 변경되었는지를 반드시 검사

 동시성 제어의 목표는 동시에 실행되는 트랜잭션 수를 최대화 하면서 입력, 수정, 삭제, 검색 시 데이터의 무결성을 유지하는데 있습니다. 하지만 읽기 작업에 공유 Lock을 사용하는 일반적인 Locking 메커니즘은 구현이 간단하지만 아래와 같은 문제점이 있습니다.

  • 읽기 작업과 쓰기 작업이 서로 방해를 일으키기 때문에 동시성 문제가 발생
  • 데이터 일관성에 문제가 생기는 경우도 있어서 Lock을 더 오래 유지하거나 테이블 레벨의 Lock을 사용해야 하고, 동시성 저하가 발생

MVCC

 MVCC는 동시 접근을 허용하는 데이터베이스에서 동시성을 제어하기 위해 사용하는 방법 중 하나입니다. MVCC 모델에서 데이터에 접근하는 사용자는 접근한 시점에서 데이터베이스의 Snapshot을 읽습니다. 이 Snapshot 데이터에 대한 변경이 완료될 때(트랜잭션이 commit될 때)까지 만들어진 변경사항은 다른 데이터베이스 사용자가 확인할 수 없습니다. 그리고 사용자가 데이터를 업데이트 하면 이전의 데이터를 갱신하는게 아니라 새로운 버전의 데이터를 UNDO 영역에 생성합니다. 대신 이전 버전의 데이터와 비교해서 변경된 내용을 기록합니다. 이렇게 해서 하나의 데이터에 대해 여러 버전의 데이터가 존재하게 되고, 사용자는 마지막 버전의 데이터를 읽게 됩니다. 이러한 구조를 가진 MVCC의 특징을 정리하면 아래와 같습니다.

  • Lock을 사용하지 않기 때문에 일반적인 RDBMS보다 매우 빠르게 작동
  • 사용하지 않는 데이터가 계속 쌓이게 되므로 데이터를 정리하는 시스템이 필요
  • 데이터 버전이 충돌하면 애플리케이션 영역에서 이러한 문제를 해결해야함
  • UNDO 블록, I/O, CR Copy 생성과 같은 부가적인 작업의 오버헤드가 발생
  • 문장 수준 읽기 일관성이 존재

문장 수준 읽기 일관성
 문장 수준 읽기 일관성은 다른 트랜잭션에 의해 데이터의 추가, 변경, 삭제가 발생하더라도 단일 SQL문 내에서 일관성 있게 값을 읽는 것을 말합니다. 일관성 기준 시점은 쿼리의 시작 지점이 됩니다. 아래의 그림을 통해 문장 수준 읽기 일관성에 대해 설명하겠습니다.


 위의 그림을 보면 쿼리는 10023 시점에서 시작하고 있습니다. 그리고 쿼리를 통해 데이터를 가져오던 중, 10023 시점 이후에 변경된 데이터 블록을 만나면, Rollback(=UNDO) 세그먼트에 저장된 정보를 이용해 10023 이전 시점으로 되돌리고서 값을 읽습니다.

참조: https://mangkyu.tistory.com/53

728x90

'DB' 카테고리의 다른 글

MySQL Stored Procedure의 장단점  (0) 2020.09.17
SQL IN과 OR의 비교  (0) 2020.09.11
DB Index  (0) 2020.06.19
Trigger  (0) 2020.06.18
Sharding  (0) 2020.05.08