Lock : 잠그다
왜 데이터베이스 Lock을 하고, 또 어떻게 하는가?
📌 왜 Lock을 사용할까?
- 재고는 1개밖에 없었지만, 두 사람이 동시에 주문하여 둘 다 성공하는 문제 발생
- 이러한 데이터 무결성 문제를 방지하기 위해 DBMS에서는 동시성 제어를 수행
- 동시성 제어: 트랜잭션들이 동시에 수행될 때, 데이터 일관성을 유지하도록 접근을 제어하는 것
어떻게?
Lock을 이용
🔑 Lock의 종류
1️⃣ 낙관적 잠금(Optimistic Lock)
데이터 갱신 시 경합이 발생하지 않을 것이라고 가정
한 사용자가 업데이트를 완료하면, 동시 업데이트 확약을 시도하는 다른 사용자에게 충돌이 있음을 알림
✅ 동작 방식
- 첫 Read 시 version을 읽음
- 구매 완료 후 다시 version을 읽음
- 처음 읽었던 version과 같다면 업데이트 진행
- 다르면 충돌 발생 → Rollback 수행
📌 특징
- 동시 업데이트가 거의 없는 경우에 사용하면 좋음
- 충돌 발생 시 롤백이 필요함
2️⃣ 비관적 잠금(Pessimistic Lock)
동일한 데이터를 동시에 수정할 가능성이 높다고 가정
다른 사용자는 잠금이 해제될 때까지 대기해야 함
✅ 동작 방식
- 데이터 접근 전 Lock 설정
- 모든 작업 완료 후 Unlock 전까지 다른 트랜잭션 대기
📌 특징
- 동시 업데이트가 빈번한 경우 유리
- Rollback이 어려운 외부 시스템과 연동된 경우 적합
🔐 비관적 잠금 연산의 종류
🔹 공유 Lock (Shared Lock, S Lock)
- Read 가능 / Write 불가능
- 여러 트랜잭션이 동시에 접근 가능
🔹 배타 Lock (Exclusive Lock, X Lock)
- Read & Write 모두 가능
- 락을 설정한 트랜잭션만 독점적으로 접근 가능
📌 공용 Lock은 양립 가능하지만, 배타 Lock은 다른 락과 양립할 수 없음
📏 Lock의 단위
Lock의 단위를 크게 가져가면 구현은 쉬워지지만 병행성이 떨어짐
Lock의 단위를 작게 가져가면 병행성은 높아지지만 구현이 복잡해짐
🔹 Lock 단위는 DBMS마다 다름
🚨 블로킹(Blocking)
- Lock 간 경합 발생 → 특정 트랜잭션이 대기하는 상태
- 배타 Lock(X Lock)은 다른 Lock과 함께 사용할 수 없기 때문에 발생
- Commit 또는 Rollback이 실행될 때 블로킹 해제
✅ 해결 방안
- 트랜잭션을 짧게 정의
- 동일 데이터를 갱신하는 트랜잭션을 동시에 수행하지 않도록 설계
- Lock Timeout을 설정하여 일정 시간 후 자동 해제
⚠ 교착 상태(Deadlock)
두 트랜잭션이 서로의 락을 기다리면서 영원히 멈추는 상태
✅ 해결 방안
- 트랜잭션 진행 방향을 동일하게 처리
- 예) 트랜잭션 A와 B가 자원 1과 2에 접근
- 무조건 1 → 2 순서로 락을 걸도록 강제
- 트랜잭션 처리 속도를 최소화
- Lock Timeout을 설정하여 일정 시간 후 해제
📚 참고 문헌
'CS' 카테고리의 다른 글
주소창에 'naver.com'을 치면 일어나는 일 (1) | 2025.02.15 |
---|---|
OS (운영체제)와 컴퓨터 (1) | 2025.02.10 |
정규화 (0) | 2025.01.10 |
트랜잭션에 대하여 (1) | 2025.01.03 |