다중 사용자 환경에서 데이터 일관성 유지를 위한 락(Lock) 메커니즘과 동시성 문제인 데드락(Deadlock)에 대해 정리한다.
락(Lock)의 유형
-
공유 락 (Shared Lock, S-Lock): 읽기 작업을 위한 잠금이다.
타 사용자의 읽기는 허용하나 수정은 제한한다. -
배타 락 (Exclusive Lock, X-Lock): 쓰기 작업을 위한 잠금이다.
타 사용자의 읽기 및 쓰기 접근을 모두 제한한다.
데드락 발생 분석
데드락은 두 트랜잭션이 상호 점유한 자원을 대기하며 정지하는 상태이다.
-- 트랜잭션 A: 1번 수정 중, 2번 수정 시도
UPDATE users SET points = points + 10 WHERE id = 1;
UPDATE users SET points = points + 10 WHERE id = 2; -- 트랜잭션 B가 2번 점유 시 대기
-- 트랜잭션 B: 2번 수정 중, 1번 수정 시도
UPDATE users SET points = points + 10 WHERE id = 2;
UPDATE users SET points = points + 10 WHERE id = 1; -- 트랜잭션 A가 1번 점유 시 대기
교착 상태 발생 시 데이터베이스 시스템은 이를 탐지하여 특정 트랜잭션을 강제 종료함으로써 해소한다.
동시성 제어 방안
- 자원 접근 순서 표준화: 모든 트랜잭션이 동일한 순서로 자원에 접근하도록 설계한다.
- 트랜잭션 최적화: 락 점유 시간을 단축하기 위해 트랜잭션 단위를 최소화한다.
- 격리 수준 설정: 비즈니스 요구사항에 적합한 트랜잭션 격리 수준을 적용한다.
데이터 일관성 확보와 시스템 성능 유지 간의 균형을 고려한 설계가 필수적인 것 같다.