매일메일을 통해
하루하루 CS 공부하기!
DBMS의 대표적인 데이터 동시성 제어 방식으로는 MVCC(Multi-Version Concurrency Control)와 LBCC(Lock-Based Concurrency Control)이 있다.
처음 들어보는 말들이다.. 차근차근히 정리하며 공부해보자.
동시성 제어
동시성 제어가 뭔지부터 파악할 필요가 있다.
동시성 제어란 DBMS가 다수의 사용자 사이에서 동시에 작용하는 다중 트랜잭션의 상호간섭 작용에서 DB를 보호하는 것이다.
일반적으로, 동시성을 허용하면 일관성이 낮아지게 된다. (반비례 관계)
DBMS는 동시성 제어를 위해 Lock 기능과 SET TRANSACTION 명령어를 이용해 트랜잭션의 격리성 수준을 조정하는 기능도 제공한다.
동시성 제어는 동시에 실행되는 트랜잭션 수를 최대화 & CRUD 시 데이터의 무결성 유지를 목표로 한다.
낙관적 동시성 제어
- 사용자들이 같은 데이터를 동시에 수정하지 않을 것이라고 가정.
- 읽기 시점에 Lock을 걸지 않는 대신 수정 시점에 값이 변경되는 지 반드시 검사
Lock-Based Concurrency Control (비관적 동시성 제어)
- 사용자들이 같은 데이터를 동시에 수정할 것이라고 가정
- 읽기 시점에 Lock을 걸고, 트랜잭션이 완료될 때까지 유지
- Shared Lock : 읽기 잠금
- Exclusive Lock : 쓰기 잠금
- 시스템의 동시성을 심각하게 떨어뜨릴 수 있어 wait과 nowait을 함께 사용해야 함.
- Lock을 해제하는 방법은 결국 commit과 rollback 밖에 없다.
문제점
Locking 메커니즘은 R/W가 서로 방해를 일으킬 수 있다.
데이터 일관성에 문제가 생기는 경우를 방지함에 있어서 Lock을 더 오래 사용하고, 동시성 저하를 유발한다.
이러한 문제를 해결하기 위해 MVCC가 탄생하게 되었다.
MVCC (Multi-Version Concurrency Control)
간단히 말해서, 데이터의 여러 버전을 유지하여 트랜잭션이 동시에 데이터를 읽고 쓸 수 있도록 하는 방식이다.
각 트랜잭션은 자신만의 일관된 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경사항에 영향을 받지 않는다.
변경이 취소되면, 원본 스냅샷을 바탕으로 데이터를 복구하고, 변경이 완료되면 최종적으로 디스크에 반영함.
정리하자면, 스냅샷을 이용하는 방식으로써 기존의 데이터를 바탕으로 이전 버전의 데이터와 비교하여 변경사항을 기록한다.
이렇게 하여 하나의 데이터에 대해 여러 버전의 데이터가 존재하게 되고, 사용자는 마지막 버전의 데이터를 읽게 되는 것이다.
따라서 원본의 데이터와 변경 중인 데이터를 동시에 유지할 수 있다.
또한 읽기 작업 시 잠금을 사용하지 않아 높은 동시성을 제공한다.
(읽기 중심의 애플리케이션에서 높은 성능을 보임)
Gap-Lock과 NextKey Lock을 통해 Phantom Read를 방지한다.
Phantom Read : Non-Repeatable Read의 한 종류로 조회해온 결과의 행이 새로 생기거나 없어지는 현상
한계
- 사용하지 않는 데이터가 계속 쌓이게 되므로 데이터를 정리하는 시스템이 필요하다.
- MVCC 모델은 하나의 데이터에 대한 여러 버전의 데이터를 허용하기 때문에 데이터 버전이 충돌될 수 있으므로 애플리케이션 영역에서 이러한 문제를 해결해야 한다
- UNDO 블록 I/O, CR Copy 생성, CR 블록 캐싱 같은 부가적인 작업의 오버헤드 발생한다.
'Back-end' 카테고리의 다른 글
[Back-End] CORS란 무엇인가요? (1) | 2025.01.10 |
---|---|
[Back-End] 갭락(Gap Lock)과 넥스트키 락(Next-Key Lock) (0) | 2025.01.09 |
[Back-End] 웹사이트에 처음 접근했을 때 발생하는 일련의 과정 (1) | 2025.01.07 |
[Back-End] 스레드, 프로세스, 코어의 수는 많을수록 좋을까요? (2) | 2025.01.02 |
[Back-End] Shared Lock과 Exclusive Lock 이란? (0) | 2024.12.31 |