728x90
반응형
SMALL
병행제어(Concurrency Control) 핵심
- 여러 사용자가 동시에 같은 데이터를 사용해도 정합성을 지키는 기술. (동시성 투명성)
- 대표 기법: 로킹(잠금), 타임스탬프, 낙관적 병행제어(Optimistic), MVCC 등.
로킹(Locking)이란?
- 누가 A 데이터를 쓰는 동안 다른 사람이 충돌나는 작업을 못 하게 잠그는 것.
- 화장실 비유: 들어가면 문을 잠가서(LOCK) 다른 사람이 동시에 못 들어오게 함.
잠금 종류(기본)
- S 락(공유, Shared): 읽기용 잠금. 여러 명이 같이 읽을 수 있음.
- X 락(배타, Exclusive): 쓰기용 잠금. 한 명만 잡을 수 있고 읽기도 막는 경우가 많음.
로킹 단위(Granularity)
- 어디에 락을 거느냐: 데이터베이스 전체 / 스키마 / 테이블 / 페이지(블록) / 행 / 열 / 개별 셀 등
- 단위가 클수록
- 오버헤드 ↓ (관리 쉬움, 락 수 적음)
- 병행성 ↓ (남는 칸 많아도 못 씀)
- 예: “27000칸 화장실 전체”를 잠그면 다른 사람은 빈 칸도 사용 불가
- 단위가 작을수록
- 병행성 ↑ (다른 칸은 사용 가능)
- 오버헤드 ↑ (락이 많아 관리·체크 비용 증가)
- 예: “한 칸(행)만” 잠그면 나머지 칸은 자유롭게 사용
요약: [큰 락] 오버헤드↓ / 병행성↓ ↔ [작은 락] 오버헤드↑ / 병행성↑\
추가적인 병행제어 기법
2단계 로킹 규약 (Two-Phase Locking, 2PL)
- 확장 단계(Growing phase): 필요한 락들을 획득만 함.
- 축소 단계(Shrinking phase): 락 해제만 하고 더 이상 신규 획득은 불가.
- 규칙을 지키면 직렬가능성이 보장되지만, 교착상태(Deadlock) 발생 가능.
| 구분 | 락 획득 시점 | 락 해제 시점 | 특징 | Deadlock |
| 기본 2PL | 수행 중 필요 시 | 일부 해제 가능 | 직렬성 보장 | 가능 |
| 엄격(Strict) | 수행 중 필요 시 | 커밋 전까지 X-lock 유지 | Undo/Redo 용이 | 가능 |
| 엄중(Rigorous) | 수행 중 필요 시 | 커밋 전까지 모든 락 유지 | 가장 안전, 직렬성+회복성 | 가능 |
| 보수적(Conservative) | 시작 시 모두 획득 | 종료 시 해제 | Deadlock 예방, 병행성↓ | 없음 |
타임스탬프 기법 (Timestamp Ordering)
- 트랜잭션 시작 시점에 고유한 타임스탬프 부여.
- 연산 순서를 타임스탬프 기준으로 강제 → 직렬화 보장.
- 충돌 발생 시 늦게 온 트랜잭션은 롤백 처리.
낙관적 병행제어 (Optimistic Concurrency Control, OCC)
- 트랜잭션 수행 중에는 락을 걸지 않고 자유롭게 실행.
- 종료 시점에 검증 단계에서 충돌 여부 확인.
- 충돌 있으면 롤백, 없으면 커밋.
- 읽기 위주 환경(충돌 적음)에 적합.
다중 버전 병행제어 (MVCC: Multi-Version Concurrency Control)
- 데이터 변경 시 기존 값을 지우지 않고 새 버전 생성.
- 읽기 트랜잭션은 자기 시작 시점의 버전을 읽음 → 읽기와 쓰기 충돌 최소화.
- 대표 사례: PostgreSQL, Oracle의 Snapshot Isolation.
병행제어를 하지 않으면 생기는 문제
갱신분실(Lost Update)
- 두 트랜잭션이 같은 데이터를 수정할 때 마지막에 쓴 값이 앞선 수정값을 덮어써서 사라짐.
- 예: T1이 수량 10→12, T2가 10→11로 갱신하면 최종 11이 되어 T1의 수정이 사라짐.
비완료 의존성(Uncommitted Dependency, Dirty Read)
- 다른 트랜잭션의 커밋 전 변경분을 읽어 사용. 이후 그 트랜잭션이 롤백하면 읽은 값이 허상이 됨.
- 예: T1이 가격 100→200(미커밋), T2가 200을 보고 결제, T1 롤백 → T2는 잘못된 값 기반 처리.
모순성(Inconsistency)
- 동시 갱신으로 무결성/제약이 깨진 상태가 관찰됨.
- 예: 계좌 이체 중 출금은 반영되고 입금은 지연되어 총액 보존 규칙 위반 상태가 잠시 노출.
연쇄복귀(Cascading Rollback)
- 한 트랜잭션이 롤백되면 그 미커밋 결과를 읽었던 다른 트랜잭션들도 줄줄이 롤백해야 하는 상황.
- 예: T2가 T1의 미커밋 값을 읽어 갱신 → T1 롤백 시 T2도 롤백 필요.
728x90
반응형
LIST