일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- GC
- 클린코드
- RESAPI
- 부모객체
- pair programming
- 미니미프로젝트
- 도커
- testdrivendevelopment
- Solid
- hateoas
- Be
- docker
- 스프링으로하는마이크로서비스구축
- ComponentScan
- Self Descript Message
- 자식객체
- DB
- java
- 트랜잭션 격리 수준
- 마이크로서비스디자인패턴
- TDD
- ATDD
- Java 22
- M:N
- 완벽이해
- Runtime Area
- G1GC
- KPT
- Execution Engine
- Spring/JAVA 서적
- Today
- Total
Programming Summary
DB) MVCC(Multi Version Concurrency Control)란? 본문
동시성 제어(Concurrency Control)이란?
동시성 제어란 DBMS가 다수의 사용자 사이에서 동시에 작용하는 다중 트랜잭션의 상호간섭 작용에서 DB를 보호하는 것을 의미한다. 일반적으로 DBMS는 동시성 제어를 할 수 있도록 Lock 기능과 Set Transaction 명령어를 이용해 트랜잭션 격리성 수준을 조정할 수 있는 기능도 제공한다. 이렇게 동시성을 제어하는 방법은 낙관적 동시성 제어와 비관적 동시성 제어가 있다.
낙관적 동시성 제어(Optimistic Concurrency Control)
- 사용자들이 같은 데이터를 동시에 수정하지 않을 것이라고 가정
- 데이터를 읽는 시점에 Lock을 걸지 않는 대신 수정 시점에 값이 변경되었는지를 반드시 검사
비관적 동시성 제어(Pessimistic Concurrency Control)
- 사용자들이 같은 데이터를 동시에 수정할 것이라고 가정
- 데이터를 읽는 시점에 Lock을 걸고, 트랜잭션이 완료될 때까지 이를 유지
- SELECT 시점에 Lock을 거는 비관적 동시성 제어는 시스템의 동시성을 심각하게 떨어뜨릴 수 있어서 wait 또는 no-wait 옵션과 함께 사용해야 함.
공유락(Shared Lock)과 배타락(Exclusive Lock)
- 공유락 : 읽기 잠금
- 배타락 : 쓰기 잠금
Locking 매커니즘의 문제점
- 읽기 작업과 쓰기 작업이 서로 방해를 일으키기 때문에 동시성 문제 발생
- 데이터 일관성에 문제가 생기는 경우도 있어 Lock을 더 오래 유지하거나 테이블 레벨의 Lock을 사용해야 하고, 동시성 저하 발생
이러한 문제점들을 해결하기 위해 MVCC가 탄생하게 됨
MVCC(Multi-Version Concurrency Control)란?
MVCC는 동시 접근을 허용하는 데이터베이스에서 동시성을 제어하기 위해 사용하는 방법 중 하나이다. MVCC에서 데이터에 접근하는 사용자는 접근한 시점에 데이터베이스의 Snapshot을 읽는다. 이 snapshot은 데이터에 대한 변경이 완료(commit)될 때까지의 변경사항은 다른 데이터베이스 사용자가 볼 수 없다. 이후에 사용자가 업데이트하면 이전의 데이터를 덮어 씌우는게 아니라 새로운 버전의 데이터를 UNDO 영역에 생성한다. 대신 이전 버전의 데이터와 비교해서 변경된 내용을 기록한다. 이렇게 해서 하나의 데이터에 대해 여러 버전의 데이터가 존재하게 되고, 사용자는 마지막 버전의 데이터를 읽게 된다.
MVCC의 접근 방식은 잠금을 필요로 하지 않기 때문에 일반적인 RDBMS보다 매우 빠르게 작동한다. 또한 데이터를 읽기 시작할 때, 다른 사람이 그 데이터를 삭제하거나 수정하더라도 영향을 받지 않고 데이터를 사용할 수 있다. 하지만 사용하지 않는 데이터가 계속 쌓이게 되므로 데이터를 정리하는 시스템이 필요하게 되고, 여러 버전의 데이터를 허용하기 때문에 데이터 버전이 충돌될 수 있으므로 애플리케이션 영역에서 이러한 문제를 해결해야 한다.
InnoDB에서는 Undo Log를 활용해 MVCC 기능을 구현한다.
'CS 공부' 카테고리의 다른 글
Java) GC란? (4) | 2024.03.28 |
---|---|
DB) 트랜잭션 격리수준이란? (1) | 2023.09.22 |
DB) 인덱스란? (1) | 2023.09.21 |
Java) JVM이란? (1) | 2023.09.08 |
Programming) OOP란? 그리고 그 외 지식들 (1) | 2023.09.05 |