안녕하세요 오늘은 데이터베이스에서 핵심이 되는 개념인 동시성 제어(Concurrency Controll)
에 대해 알아보겠습니다 👨💻
동시성 제어란 DBMS 가 다수의 사용자 사이에서 동시에 작용하는 다중 트랜잭션의 상호간섭 작용에서 Database 를 보호하는 것
을 의미합니다.
일반적인 어플리케이션은 다수의 사용자의 요청을 처리하고 이러한 요청에는 DB 접근을 필요로 하는 요청도 포함합니다.
이때 한번에 다수의 DB 접근을 필요로 하는 요청이 들어올 때 트랜잭션 단위로 DB 접근을 하게 되는데 DB 접근을 동시적으로 모두 허용해주면 데이터베이스의 일관성과 무결성이 깨지게됩니다 ⛔️
이를 방지하기 위해 동시성 제어
을 통해 데이터베이스를 보호할 수 있습니다.
동시성 제어
는 병행 제어
라고도 불리며 한번에 들어온 복수의 트랜잭션을 직렬화 하는 수행을 보장합니다 🤖
이 개념에서 동시성과 대조되는 것이 일관성인데, 동시성이 높을 수록(여러 트랜잭션이 동시에 DB 접근이 가능할수록) 데이터베이스의 일관성이 깨지게됩니다.
따라서 둘은 반비례
관계입니다 🔄
다수의 사용자의 동시 접속을 위해 DBMS 는 동시성 제어
를 할 수 있도록 다양한 기법을 제공합니다 🧑🔧
동시성 제어 기법 | 설명 |
---|---|
로킹 기법 | 트랜잭션이 데이터에 잠금(Lock) 을 설정하면 다른 트랜잭션은 해당 데이터에 대해 잠금이 해제(UnLock)될 때까지 접근/수정/삭제 불가. |
타임 스탬프 기법 | 시스템에서 생성하는 고유 식별자인 타임 스탬프를 트랜잭션에 부여함으로써 트랜잭션 간의 접근 순서를 미리 정함. |
적합성 검증(낙관적) | 먼저 트랜잭션을 수행하고 종료할 때 적합성을 검증하여 데이터베이스에 최종 반영. |
트랜잭션이 사용하는 데이터 자원에 대하여 상호 배제(Mutual Exclusive) 기능을 제공하는 기법
상호 배제는 트랜잭션이 데이터 항목에 대하여 잠금(Lock) 을 설정한 트랜잭션이 해재(UnLock) 할 때까지 데이터를 독점적으로 사용할 수 있는 것을 의미
종류 | 주요 개념 |
---|---|
공유 Lock (Shared Lock) | 공유 잠금한 트랜잭션이 데이터 항목에 대하여 읽기(Read) 만 가능 다른 트랜잭션도 읽기(Read) 만을 실행 할 수 있는 형태 |
전용 Lock (Exclusive Lock) | 전용 잠금한 트랜잭션은 데이터 항목에 대하여 읽기(Read) 와 기록(Write) 모두 가능 다른 트랜잭션은 읽기(Read) 와 기록(Write) 모두 할 수 없음 |
블로킹(Blocking) 현상
블로킹
이란 Lock 간 경합이 발생하여 특정 Transaction 작업을 진행하지 못하고 멈춰선 상태를 말합니다.
앞서 설명한 공유 Lock 은 공유 Lock 끼리는 서로 특정 데이터에 대해 동시 접근이 가능하기 때문에 블로킹
이 발생하지 않지만, 공유 Lock - 전용 Lock 혹은 전용 Lock - 공유 Lock 끼리는 블로킹
이 발생합니다.
이러한 현상은 어플리케이션 성능에 좋지 않은 영향을 끼치기 때문에 블로킹
을 최소화 해야합니다 ❗️
상단에 이미지는 블로킹
을 설명하기 위한 이미지입니다.
Transaction A
와 Transcation B
가 전용 략을 통해 2번 째 로우에 있는 YKH
데이터 에 접근한다고 가정해봅시다.
이때 전용락 끼리는 동시 접근(공유) 가 불가능하기에 경합이 발생합니다.
`블로킹` 해결 방법 👍
1. 한 트랜잭션의 길이를 너무 길게 설계하는 것은 `블로킹` 의 확률을 증가시키므로 가능한 짧게 설계하기
2. 설계 시, 같은 데이터를 동시에 갱신하는 트랜잭션을 수행하지 않도록 하기
3. 트랜잭션 격리성 수준을 불필요하게 상향 조정하지 않기
4. 쿼리를 너무 오랜시간 동안 잡아두지 않도록 적절한 튜닝을 진행하기
교착 상태(DeadLock)
교착 상태
란 두 트랜잭션이 각각 Lock 을 설정하고 서로의 Lock 에 접근하여 값을 얻어오려 할 때 이미 각 트랜잭션에 의해 Lock 이 설정되어 있기 때문에 트랜잭션이 영원히 처리가 되지않게 되는 상태를 말합니다.
앞에서 알아본 것처럼 두 트랜잭션이 공유락을 사용한다면 교착 상태는 발생하지 않습니다.
하지만 그 외 경우에는 주의를 해서 설계 해야합니다 ❗️
상단에 이미지는 교착 상태
를 설명하기 위한 이미지 입니다.
game_master, game_detail 테이블이 있습니다.
트랜잭션 A가 game_master 테이블에 5번 Row를 수정했고 이제 game_detail 테이블에 5번 Row를 이어서 수정하려고 합니다.
동시에 트랜잭션 B는 game_detail 테이블의 5번 Row를 수정하고 이어서 game_master 테이블의 5번 Row를 수정하려고 합니다.
이 경우 트랜잭션 A는 game_master 테이블의 5번 Row에 전용 락을 설정했고 트랜잭션 B는 game_detail 테이블의 5번 Row에 전용 락을 설정하였습니다.
그리고 교차로 트랜잭션 A는 game_detail의 5번 row의 Lock 설정을 하려고 하고 트랜잭션 B는 game_master의 5번 row에 Lock 설정을 하려고 합니다.
하지만 이미 각 row들은 서로다른 트랜잭션에 의해서 전용 락이 걸려 있습니다.
따라서 Lock이 해제되기를 서로 기다립니다. 하지만 이 Lock은 풀리지 않을 서로의 트랜잭션 기다리므로 영원히 풀리지 않을것입니다 ❗️
트랜잭션의 순서대로 시간 스탬프를 지정하여 동시성 제어의 기준으로 사용되는 개념
타임 스탬프에는 System 시계 사용법
과 논리적인 계수기 사용법
이 존재
구분 | 내용 |
---|---|
System 시계 사용법 | 트랜잭션이 시스템에 들어올 때의 System Clock 적용 |
논리적인 계수기 사용법 | 트랜잭션의 시간 스탬프는 그 트랜잭션이 시스템에 들어올 때의 시스템 계수기의 값과 같은 개념 |
MVCC(Multi Version Concurreny Control)
는 동시 접근을 허용하는 데이터베이스에서 동시성을 제어하기 위해 사용하는 방법 중 하나입니다.
데이터에 접근하는 사용자는 접근하는 시점에 데이터베이스 snapshot 을 읽습니다.
이 snapshot 데이터에 대한 변경이 완료(commit) 될 때까지의 변경사항은 다른 데이터베이스 사용자가 볼 수 없습니다.
이후에 사용자가 업데이트 하면 이전의 데이터를 덮어 씌우는 것이 아니라 새로운 버전의 데이터를 UNDO
영역에 생성합니다.
대신 이전 버전의 데이터와 비교해서 변경된 내용을 기록합니다.
이렇게 여러 버전의 데이터를 가지며 현재 실행하고 있는 스케쥴의 직렬 가능성이 보장되는 적절한 버전을 선택하여 접근하도록 하는 기법을 MVCC
라고 합니다 ❗️
MVCC
접근 방식은 트랜잭션의 대기 시간이 존재하지 않음으로 빠르게 동작할 수 있습니다.
또한, 데이터를 읽기 시작할 때 , 다른 트랜잭션이 그 데이터를 삭제하거나 수정해도 영향을 받지 않고 조회 가능합니다.
기법 이름 | 장점 | 단점 |
---|---|---|
Locking 기법 | 1. 데이터 오류 가능성 사전에 예방 2. 구현하기 쉬움 | 1. Lock 대기 시간 -> 동시성 저하 2. 교착 상태(DeadLock) 발생 가능성 존재 |
TimeStamp | 1. 교착 상태(DeadLock) 발생 가능성 없음 2.트랜잭션 대기 시간 없음 | 1. Rollback 발생 확률이 높음 |
적합성 검증(낙관적) | 1. 동시 처리 능력 증가 2. 트랜잭션 대기 시간 없음 | 1. 장기 트랜잭션 철회시 자원 낭비 |
MVCC | 1. 트랜잭션 대기 시간 없음 2. 다른 트랜잭션이 해당 데이터를 수정해도 영향받지 않음 | 1. 사용하지 않는 데이터를 정리하는 시스템이 필요 2. 데이터 버전의 충돌이 일어날 수 있음 3. UNDO 블록, I/O 등의 부가적인 오버헤드 발생 |
문제점 | 내용 |
---|---|
갱신 손실 | 트랜잭션이 동일 데이터를 동시에 갱신 할 경우 발생 하며 특정 트랜잭션의 갱신 내용이 반영되지 않는 오류 |
현황파악 오류(Dirty Read) | 트랜잭션 과정에서 갱신을 하고 트랜잭션 종료하지 전에 다른 트랜잭션이 참조함으로써 조회 결과의 정확성이 깨지는 오류 |
모순성 | 두 트랜잭션이 동시에 실행할 때 DB 가 일관성이 없는 상태로 남는 오류 |
연쇄 복귀 | 복수의 트랜잭션이 동일한 데이터 공유시 특정 트랜잭션이 처리를 취소할 경우 다른 트랜잭션은 해당 취소를 적용하지 못하는 오류 |
동시성제어개요
[Database] MVCC(다중 버전 동시성 제어)란?
[ 기술면접 / 데이터베이스 ] 동시성 제어( Concurrency Control )
2단계 로킹 규약
[데이터베이스] Lock에 대해서 알아보자 - 기본편