데이터베이스 병행 작업 시 문제점을 해결하기 위한 로킹과 기본적 2PL에 대해서 알아보겠습니다.
[ Contents ]
1. 병행작업의 문제점
운영체제에서 같은 자원을 쓰는 프로세스를 병렬 처리할 때 교착상태(Deadlock)에 빠지듯이, DB에서도 같은 데이터를 동시에 여러 트랜잭션이 처리할 때 문제가 생깁니다. 이를 해결하기 위해서 병행 제어 기법을 사용합니다.
2023.04.25 - [Data Engineering] - [DB] 데이터베이스 동시성 제어(병행 제어)와 문제점
2. 로킹(Locking)
서로 다른 트랜잭션이 동일한 데이터에 동시에 수정하지 못하도록 Lock을 걸어 독점적 사용을 보장하는 기법
데이터에 접근하기 전에, 미리 Lock을 걸고 작업이 끝나면 Unlock을 합니다. 그 사이에는 어떤 트랜잭션도 해당 데이터에 수정하지 못합니다. 다만 읽기 연산은 가능합니다.
- 공용(Shared) lock: 다른 트랜잭션도 읽기 연산은 가능, 쓰기 연산은 불가능
- 전용(Exclusive) lock: 다른 트랜잭션은 읽기, 쓰기 연산 불가능
작업 중에 다른 트랜잭션이 읽어가도 되는 건 공용 Lock을 걸고, 온전히 자신만 데이터를 써야할 때에는 전용 Lock을 겁니다. 하지만 이럼에도 모순성 문제는 해결하지 못합니다.
트랜잭션 연산 중간에 Lock 이외의 값을 변경해서 DB 일관성이 훼손되는 경우, 로킹 방식으로는 방지할 수 없습니다.
3. 기본적 2PL
- 확장 단계: Lock 연산은 할 수 있으나, Unlock 연산은 할 수 없음 (데이터를 점유하는 단계)
- 축소 단계: Unlock 연산은 할 수 있으나, Lock 연산은 할 수 없음 (데이터를 해제하는 단계)
트랜잭션 초기는 확장 단계로 lock연산만 가능합니다. 이후 Unlock 연산을 한다음에는 축소 단계로 진입해서 다시 Lock연산을 할 수 없습니다. 즉, 무분별하게 데이터 점유와 해제를 반복할 수 없습니다.
이를 통해, 트랜잭션의 직렬 가능성을 보장할 수 있습니다. 직렬 가능성은 여러 트랜잭션을 번갈아가며 작업(인터리빙, Interleaving)해도, 독립적으로 연속 실행한 결과와 같은 걸 보장합니다.
하지만, 교착상태(Deadlock)는 해결하지 못합니다. 각 트랜잭션이 서로가 필요한 데이터를 lock한 상태라면, 무한정 대기가 이어질 수 밖에 없습니다. 따라서 교착상태는 별도의 모니터링을 통해서 해결해야 합니다.
4. 엄격한(strict) 2PL과 엄중한(rigorous) 2PL
엄격한 2PL: 트랜잭션이 완료될 때까지, 모든 전용 Lock은 unlock 없이 유지
엄중한 2PL: 트랜잭션이 완료될 때까지, 모든 Lock은 unlock 없이 유지
엄격한 2PL은 가장 널리 사용되는 방법으로 연쇄 복귀(Cascading Rollback) 문제를 막을 수 있습니다.
반면 엄중한 2PL은 병렬성이 떨어지지만, 엄격한 2PL보다는 구현이 용이한 장점이 있습니다.
다만, 이 역시 교착상태는 발생할 수 있습니다.
'CS > DB' 카테고리의 다른 글
[DB] B-Tree (Balanced Tree): 데이터베이스 인덱스 저장 방식 (0) | 2023.08.07 |
---|---|
[DB] 데이터 웨어하우스와 데이터 마트, 그리고 ETL이란? (0) | 2023.04.25 |
[DB] 데이터베이스 동시성 제어(병행 제어)와 문제점 (0) | 2023.04.25 |
[DB] 데이터베이스 로그 회복 기법 (즉시 갱신, 지연 갱신) (0) | 2023.04.25 |
[DB] 데이터베이스 장애와 회복 기법 (Redo 재실행, Undo 취소) (0) | 2023.04.25 |
댓글