Database - Concurrency control - Locking
Locking
1. 개요
공유 자원의 접근 순서나 한번에 접근하는 수를 제한하기 위한 방법이다.
운영체제에서 멀티 스레드간 자원 동기화할때도 자주 쓰는 방법이기 때문에 새로울건 없다.
기본적인 Lock 타입은 총 두 가지이다.
- S-Lock : Shared lock의 줄임말로 읽을때 걸어두는 Lock이다.
- X-Lock : Exclusive Lock의 줄임말로 쓸때 걸어두는 Lock이다.
S-Lock이 걸려있으면 다른 주체의 Read를 위해서는 접근할 수 있는데 반해 Write는 할 수 없고 X-Lock이 걸려있으면 다른 주체의 Read든 Write든 모두 접근 할 수 없다.
2. Two-Phase Locking
1) 사용 시점
기본 Locking 방식에서 좀 더 진보된 형태의 Locking 방식으로 아래와 같은 상황에서 사용한다.
- 트랜잭션 간 동시성 제어가 필요한 경우
- 여러 사용자 또는 애플리케이션이 동시에 데이터베이스에 액세스하고 조작하며 데이터 무결성을 유지해야 할 때 사용
- 직렬성을 보장해야 하는 경우
- 시스템이 트랜잭션이 순차적으로, 즉 순차적으로 실행되는 것처럼 보이도록 해야 할 때 (데이터 베이스 일관성 유지)
- 읽기/쓰기 충돌을 방지하여 트랜잭션 간의 부작용을 방지해야할 때
2) 사용 방식
Two-Phase라는 이름 답게 2단계로 나뉜다.
Phase 1 : Growing
각 트랜잭션은 각 자원에 대해서 lock을 받아오는 것만 가능하다.
Phase 2 : Shrinking
각 트랜잭션은 각 자원에 대해서 lock을 반납하는것만 가능하다.
예시
아래는 트랜잭션 한 개의 예시이다.
위와 같이 한번에 Growing Phase가 지나면 unlock만 가능하고, Shrinking Phase가 끝나면 해당 트랜잭션이 끝나게 하는 것이다.
문제점
불필요한 대기와 빠른 lock
lock 대기 시간이 길어져서 성능 저하가 일어날 수 있다.Deadlock
lock을 잡고 있기 때문에 Deadlock이 발생할 수 있다.Cascading Rollback
하나의 롤백이 다른 Rollback을 언쇄적으로 불러 일으킬 수 있다.
3. Conservative Two-Phase Locking Protocol
Growing Phase가 없이 Transaction 시작전에 필요한 lock을 모두 받아두고, 처리한 뒤에 락을 푸는 것이다.
- 데드락이 발생하지 않는다. (한번에 필요한 락을 모두 챙기기 때문이다)
- 하지만 구현이 어렵다 -> 어떤 자원이 어떤 락이 필요한지 미리 판단해야하기 때문이다. (사실상 불가능하다)
- 여전히 Cascading Rollback은 일어날 수 있다.
4. Strict Two-Phase Locking Protocol
모든 X-lock은 트랜잭션이 커밋되거나 중단될때까지 유지되지만 S-lock은 commit이나 abort 되기 전에 unlock 된다.
- 격리성이 강하다.
- 동시성 또한 높다.
- 셧다운시 복구 가능성이 있다.
- Cascading Rollback은 방지된다.
- Deadlock 발생 가능성은 여전히 존재한다.
5. Rigorous Two-Phase Locking Protocol
모든 S-lock과 X-lock은 트랜잭션이 커밋되거나 중단될때까지 유지된다.
- 격리성이 제일 강하다.
- 동시성은 낮다. (S-lock까지 잡고 있으므로)
- 셧다운시 복구가능성이 훨씬 크다.
- Cascading Rollback은 방지된다.
- Deadlock 발생 가능성은 여전히 존재한다.
※ 추가 업데이트 및 검증 예정이고, 아직 완벽하지 않으니 참고만 바란다.
참고자료
- 서강대학교 김영재 교수님 고급데이터 베이스 강의 자료