-
DB 시스템에서의 동시성 제어 방법성장과정(dev)/DBMS 2024. 12. 20. 16:54
데이터베이스 시스템에서는 동시성 제어를 위해서 주로 사용하는 두가지 방법 MVCC, Lock-Based Concurrency Control 이 있습니다.
1. MVCC (다중버전 동시성 제어)
- 데이터의 여러 버전을 유지하여 트랜잭션이 동시에 데이터를 읽고 쓸 수 있도록 하는 방식입니다.
- 특징
- 각 트랜잭션은 자신만의 일관된 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항에 영향을 받지 않습니다.
- 데이터의 각 버전을 유지하여 읽기 작업이 쓰기 작업과 독립적으로 이루어질 수 있습니다. 트랜잭션은 시작 시점의 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항을 보지 못합니다.
- 트랜잭션이 시작된 시점의 데이터 상태를 기반으로 읽기 작업을 수행하여 일관성을 유지합니다. 또 갭락과 넥스트키 락을 통해 팬텀 리드를 방지합니다.
- 장점
- 읽기 작업 시 잠금을 사용하지 않아 높은 동시성을 제공합니다.
- 읽기 작업이 잠금에 의해 지연되지 않아, 읽기 중심의 애플리케이션에서 우수한 성능을 보입니다.
- 읽기 작업 시 잠금을 사용하지 않으므로, 쓰기 작업과의 충돌이 줄어듭니다.
- 단점
- 여러 버전의 데이터를 유지해야 하므로 저장 공간이 더 많이 필요할 수 있습니다.
2. Lock-Based Concurrency Control (DBMS의 잠금 기반 동시성 제어 프로토콜)
- Lock-Based 방식은 데이터에 접근할 때 잠금(Lock) 을 사용하여 동시성을 제어합니다.
- 트랜잭션이 데이터를 읽거나 수정할 때 해당 데이터에 잠금을 걸어 다른 트랜잭션의 접근을 제한합니다. 즉, 잠금을 통해 데이터의 일관성과 무결성을 직접적으로 제어합니다.
- 데이터에 접근할 때 잠금을 걸어 다른 트랜잭션의 접근을 제한합니다.
- 읽기 작업은 공유 락을, 쓰기 작업은 배타 락을 사용하여 동시성을 제어합니다. ( 공유락, 베타락 관련 글 -> https://lowell-dev.tistory.com/394)
- 단점
- 많은 다수의 트랜잭션이 동일한 데이터에 접근할 경우 성능 저하가 발생할 수 있습니다.
- 또 잘못된 잠금 순서나 설계로 인해 교착 상태(Deadlock)가 발생할 위험이 있습니다.
주요 방법 두개 사용 예시
- MySQL의 InnoDB는 MVCC와 Lock-Based Concurrency Control을 결합하여 동시성 제어를 최적화합니다.
- 읽기 작업 (Read Transaction):
- MVCC를 사용합니다.
- 읽기 작업은 스냅샷 읽기(Snapshot Read)를 통해, 트랜잭션이 시작될 당시의 데이터 스냅샷을 기반으로 실행됩니다.
- 이를 통해 잠금을 걸지 않고도 읽기 작업을 수행할 수 있으며, 높은 동시성을 제공합니다.
- 쓰기 작업 (Write Transaction):
- 잠금(Locking)을 사용하여 데이터를 수정합니다.
- Exclusive Lock(배타적 잠금)과 Next-Key Lock 등을 사용하여 트랜잭션 간 데이터 충돌을 방지하고, 데이터 일관성과 무결성을 보장합니다.
- 읽기 작업 (Read Transaction):
그밖에도 동시성 제어를 위한 다양한 방식
- Timestamp-Based Concurrency Control: 트랜잭션에 타임스탬프를 부여하고, 트랜잭션 간의 실행 순서를 조정하여 충돌을 방지.
- Validation-Based Concurrency Control (Optimistic Concurrency Control): 트랜잭션이 실행되는 동안 데이터에 잠금을 걸지 않고, 커밋 시점에 검증(Validation)을 통해 데이터 충돌 여부를 확인.
- Graph-Based Concurrency Control: 트랜잭션 간 의존성을 그래프로 표현하고, 사이클(순환 의존성)이 없도록 제어.
*** 검색이 필요했던 용어 ***
갭 락(Gap Lock)
- 인덱스의 특정 레코드 간 "공백(갭)"에 잠금을 거는 방법입니다.
- 목표: 다른 트랜잭션이 공백에 새로운 데이터를 삽입하지 못하도록 방지.
작동방식
- 인덱스에 10, 20, 30이라는 값이 있고, 트랜잭션 A가 age > 15로 데이터를 조회하며 갭 락을 설정.
결과: - 갭(10과 20 사이, 20과 30 사이)에 새로운 값 삽입(예: age = 25)이 금지됩니다.
- 기존 레코드(예: age = 20)는 갱신 가능.
넥스트 키 락(Next-Key Lock)
- 갭 락 + 현재 레코드 락을 결합한 잠금 방식입니다.
- 목표: 특정 레코드와 그 주변 갭 모두를 보호하여 팬텀 리드를 방지.
작동 방식
- 인덱스 범위와 그 경계 값(레코드)을 동시에 잠급니다.
- 예를 들어, 10, 20, 30의 인덱스가 있을 때, 20에 대한 넥스트 키 락이 걸리면:
- 레코드 20에 대한 수정/삭제 금지.
- **갭(10과 20 사이)**에도 새로운 레코드 삽입 금지.
'성장과정(dev) > DBMS' 카테고리의 다른 글
샤드란? 데이터베이스 수평 확장의 핵심 개념! (1) 2024.12.21 mysql) BIGINT 와 BIGINT UN 의 차이점 (0) 2023.04.14 [mssql 테이블정보 확인] oracle / DESC '테이블명' ---> mssql / ? (0) 2020.10.06 mssql sum에 연산값들이 모두 null값일 때 (0) 2020.09.29