데이터베이스 병행 작업 시 문제점을 해결하기 위한 로킹과 기본적 2PL에 대해서 알아보겠습니다.
1. 병행작업의 문제점
운영체제에서 같은 자원을 쓰는 프로세스를 병렬 처리할 때 교착상태(Deadlock)에 빠지듯이, DB에서도 같은 데이터를 동시에 여러 트랜잭션이 처리할 때 문제가 생깁니다. 이를 해결하기 위해서 병행 제어 기법을 사용합니다.
2023.04.25 - [Data Engineering] - [DB] 데이터베이스 동시성 제어(병행 제어)와 문제점
[DB] 데이터베이스 동시성 제어(병행 제어)와 문제점
데이터베이스는 여러 트랜잭션을 번갈아가며 함께 처리합니다. 그러다 보니 서로 얽히는 경우도 생기는데, 이러한 병행수행의 문제점에 대해서 알아보겠습니다. [ Contents ] 1. 동시성 제어 (병행
star7sss.tistory.com
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 |
댓글