동시성 제어란?
동시성 제어
- 동시성 제어란 DBMS가 다수의 사용자 사이에서 동시에 작용하는 다중 트랜잭션의 상호간섭 작용에서 Database를 보호하는 것을 의미합니다.
- 일반적인 애플리케이션은 다수의 사용자의 요청을 처리하고 이러한 요청에는 DB 접근을 필요로 하는 요청도 포함합니다.
- 이때 한번에 다수의 DB 접근을 필요로 하는 요청이 들어올 때 트랜잭션 단위로 DB 접근을 하게되는데 DB 접근을 동시적으로 모두 허용해주면 데이터베이스의 일관성과 무결성이 깨지게 됩니다.
- 이를 방지하기 위해 동시성 제어를 통해 데이터베이스를 보호할 수 있습니다.
- 동시성 제어는 병행 제어라고도 불리며 한 번에 들어온 복수의 트랜잭션을 직렬화 하는 수행을 보장합니다.
- 이 개념에서 동시성과 대조되는 것이 일관성인데, 동시성이 높을수록 (여러 트랜잭션이 동시에 DB 접근이 가능할수록) 데이터베이스의 일관성이 깨지게 됩니다.
- 따라서 둘은 반비례 관계입니다.
- 다수의 사용자의 동시 접속을 위해 DBMS는 동시성 제어를 할 수 있도록 다양한 기법을 제공합니다.
동시성 제어 기법 종류
-
동시성 제어 기법 설명 로깅 기법 트랜잭션이 데이터에 잠금(Lock)을 설정하면 다른 트랜잭션은 해당 데이터에 대한 잠금이 해제(UnLock)될 때까지 접근 / 수정 / 삭제가 불가능합니다. 타임 스탬프 기법 시스템에서 생성하는 고유 식별자인 타임 스탬프를 트랜잭션에 부여함으로써 트랜잭션 간의 접근 순서를 미리 정합니다. 적합성 검증 (낙관적) 먼저 트랜잭션을 수행하고 종료할 때 적합성을 검증하여 데이터베이스에 최종 반영합니다. MVCC(다중 버전 동시성 제어 기법) 동시 접근을 허용하는 데이터베이스에서 동시성을 제어하기 위해 사용하는 방법 중 하나입니다.
1)로깅 기법
- 트랜잭션이 사용하는 데이터 자원에 대하여 상호 배제(Mutual Exclusive) 기능을 제공하는 기법입니다
- 상호 배제는 트랜잭션이 데이터 항목에 대하여 잠금(Lock)을 설정한 트랜잭션이 해제(UnLock)할 때까지 데이터를 독점적으로 사용할 수 있는 것을 의미합니다.
-
종류 주요 개념 공유 Lock (Shared Lock) 공유 잠금한 트랜잭션이 데이터 항목에 대하여 읽기(Read)만 가능합니다.
다른 트랜잭션도 읽기(Read)만을 실행할 수 있는 형태입니다.전용 Lock (Exclusive Lock) 전용 잠금한 트랜잭션은 데이터 항목에 대하여 읽기(Read)와 기록(Write) 모두 가능합니다.
다른 트랜잭션은 읽기(Read)와 기록(Write) 모두 할 수 없습니다.
- 로깅 기법의 허점
- 락을 걸거나 해제하는 시점에 제한을 두지 않으면 두 개의 트랜잭션이 동시에 실행될 때 데이터의 일관성이 깨질 수 있습니다.
- 즉, 중간에 락의 적용이 되지 않음으로 허점이 생깁니다.
- 블로킹(Blocking) 현상
- 블로킹이란 Lock 간 경합이 발생하여 특정 트랜잭션 작업을 진행하지 못하고 멈춰선 상태를 말합니다.
- 앞서 설명한 공유 Lock은 공유 Lock끼리는 서로 특정 데이터에 대한 동시 접근이 가능하기 때문에 블로킹이 발생하지 않지만, 공유 Lock - 전용 Lock 혹은 전용 Lock - 공유 Lock끼리는 블로킹이 발생합니다.
- 이러한 현상은 애플리케이션 성능에 좋지 않은 영향을 끼치기 때문에 블로킹을 최소화 해야합니다.
- 트랜잭션 A와 트랜잭션 B가 전용 락을 통해 2번째 로우에 있는 YKH 데이터에 접근한다고 가정했을 때
이때 전용 락끼리는 동시 접근(공유)가 불가능하기에 경합이 발생합니다.
- 트랜잭션 A와 트랜잭션 B가 전용 락을 통해 2번째 로우에 있는 YKH 데이터에 접근한다고 가정했을 때
- 블로킹 해결 방법
- 한 트랜잭션의 길이를 너무 길게 설계하는 것은 블로킹의 확률을 증가시키므로 가능한 짧게 설계합니다.
- 설계 시, 같은 데이터를 동시에 갱신하는 트랜잭션을 수행하지 않도록 합니다.
- 트랜잭션 격리성 수준을 불필요하게 상향 조정하지 않습니다.
- 쿼리를 너무 오랜 시간 동안 잡아두지 않도록 적절한 튜닝을 진행합니다.
- 교착 상태 (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은 풀리지 않을 서로의 트랜잭션을 기다리므로 영원히 풀리지 않을 것입니다.
2) 타임 스탬프 (Time Stamp)
- 트랜잭션의 순서대로 시간 스탬프를 지정하여 동시성 제어의 기준으로 사용되는 개념입니다.
- 타임 스탬프에는 System 시계 사용법과 논리적인 계수기 사용법이 있습니다.
-
구분 내용 System 시계 사용법 트랜잭션이 시스템에 들어올 때의 System Clock 적용합니다. 논리적인 계수기 사용법 트랜잭션의 시간 스탬프는 그 트랜잭션이 시스템에 들어올 때의 시스템 계수기의 값과 같은 개념입니다.
3) 적합성 검증 (낙관적 검증 기법)
- 트랜잭션이 어떠한 검증도 수행하지 않고, 일단 트랜잭션을 수행하고 종료시 검증을 수행하여 데이터베이스에 반영하는 방법입니다.
- 만약 트랜잭션의 길이가 길어 장기적으로 트랜잭션이 진행 되었는데 Roll Back 되는 경우 자원 낭비입니다.
- 동시 사용 빈도가 낮은 시스템에서 사용합니다.
4) MVCC (다중 버전 동시성 제어 기법)
- 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' 카테고리의 다른 글
[Database] - HeidiSQL 단축키 설정 (0) | 2024.10.17 |
---|---|
[Database / Redis] - Redis 비밀번호 설정 (0) | 2024.04.06 |
[Database] - ORM(Object Relational Mapping)이란 (0) | 2024.03.11 |
[DataBase / SQL] 클러스터드 인덱스 (Clustered Index), 넌 클러스터드 인덱스 (Non Clustered Index)란 (0) | 2024.02.14 |
[Database] - 레디스(Redis)란? (1) | 2024.02.05 |