DB

[병행제어] 다중 단위 로킹(Multi-Granularity Locking, MGL)

타우루스 2026. 2. 9. 13:02

다중 단위 로킹(Multi-Granularity Locking, MGL) 기법은 데이터베이스의 병행 제어(Concurrency Control) 효율성을 높이기 위해 필수적으로 이해해야 하는 개념입니다.

1. 개요 및 목적

  • 정의: 데이터베이스 객체들을 다양한 크기(Granularity)의 계층적 구조(트리)로 정의하고, 트랜잭션의 특성에 따라 가장 효율적인 단위로 로킹을 수행하는 기법입니다.
  • 핵심 목적: 병행성(Concurrency)과 오버헤드(Overhead) 간의 트레이드오프를 최적화하는 것입니다.
    • 모든 트랜잭션이 테이블 전체를 잠그면 병행성이 떨어지고, 모든 트랜잭션이 행(Row) 단위만 잠그면 로크 관리에 대한 시스템 부하(오버헤드)가 급증합니다.

2. 로킹 단위(Granularity)의 계층 구조

일반적으로 다음과 같은 포함 관계(트리 구조)를 가집니다.

데이터베이스(DB) → 릴레이션(Table) → 페이지(Page/Block) → 튜플(Row/Record)

로킹 단위 로크의 개수 로킹 오버헤드 병행성(Concurrency)
큼 (예: Table) 적음 낮음 낮음
작음 (예: Row) 많음 높음 높음

3. 의도적 잠금 (Intention Lock)의 도입

MGL의 핵심은 상위 객체(예: 테이블)만 보고도 하위 객체(예: 튜플)의 잠금 상태를 파악할 수 있어야 한다는 점입니다. 이를 위해 의도적 잠금(Intention Lock)을 사용합니다.

  • IS (Intention Shared): 하위 노드에 대해 공유 잠금(S)을 설정할 의도가 있음.
  • IX (Intention Exclusive): 하위 노드에 대해 배타 잠금(X)을 설정할 의도가 있음.
  • SIX (Shared + Intention Exclusive): 현재 노드 전체를 공유(S) 잠금으로 읽으면서, 하위 노드 중 일부를 수정(X)할 의도가 있음. (S + IX 속성)

4. 로크 호환성 행렬 (Compatibility Matrix)

감리사 시험에서 가장 자주 출제되는 부분입니다. 대각선을 기준으로 대칭이며, X Lock은 모든 락과 호환되지 않음을 기억하십시오.

요청 \ 현재 IS IX S SIX X
IS O O O O X
IX O O X X X
S O X O X X
SIX O X X X X
X X X X X X
  • O: 호환 가능 (동시 허용)
  • X: 호환 불가 (대기 필요)
  • 팁: IX와 S가 호환되지 않는 이유 - 누군가 하위 데이터를 수정(IX)하려는데, 상위 전체를 읽기 전용(S)으로 잠그면 데이터 불일치가 발생하기 때문입니다.

5. 로킹 프로토콜 (Locking Protocol)

데이터 무결성을 보장하기 위해 반드시 지켜야 하는 순서입니다.

  1. 잠금 단계 (Top-Down): 위에서 아래로
    • 하위 노드에 락을 걸기 위해서는 반드시 상위 노드에 적절한 Intention Lock을 먼저 걸어야 합니다.
    • 예: 특정 Row에 X Lock을 걸려면 → DB(IX) → Table(IX) → Row(X) 순서로 진행.
  2. 해제 단계 (Bottom-Up): 아래에서 위로
    • 잠금 해제는 하위 노드부터 수행하고 상위 노드로 올라갑니다.
    • 예: Row(Unlock) → Table(Unlock) → DB(Unlock).

다중 단위 로킹(Multiple Granularity Locking) 프로토콜에서 부모 노드의 로크(Lock) 타입에 따라 자식 노드에 걸 수 있는 로크의 종류는 명확하게 정해져 있습니다.

 

부모 노드에 IS, IX, SIX 로크를 걸었을 때 자식 노드에 허용되는 로크 타입과 그 이유는 다음과 같습니다.

1. 부모 노드가 IS (의도 공유) 로크인 경우

  • 자식 노드에 가능한 로크: IS, S
  • 이유: 부모 노드의 IS 로크는 "하위 노드 중 어딘가를 읽겠다(Read)"는 의도만을 나타냅니다. 상위에서 읽기 의도만 승인받았으므로, 하위 노드에서는 데이터를 읽기 위한 S (공유) 로크나, 더 하위 노드로 읽기 의도를 전달하기 위한 IS (의도 공유) 로크만 걸 수 있습니다. 데이터를 변경하는 X, IX, SIX 로크는 걸 수 없습니다.

2. 부모 노드가 IX (의도 배타) 로크인 경우

  • 자식 노드에 가능한 로크: IS, S, IX, X, SIX (모든 로크 가능)
  • 이유: 부모 노드의 IX 로크는 "하위 노드 중 어딘가를 쓰겠다(Write)"는 의도를 나타냅니다. 쓰기 권한은 가장 포괄적인 권한이므로, 하위 노드에서는 읽기(IS, S)와 쓰기(IX, X, SIX)와 관련된 모든 형태의 로크를 자유롭게 획득할 수 있습니다.

3. 부모 노드가 SIX (공유 의도 배타) 로크인 경우

  • 자식 노드에 가능한 로크: IX, X, SIX
  • 이유: SIX 로크는 S 로크 + IX 로크가 결합된 형태입니다. 즉, 현재 노드와 그 하위 노드 전체를 이미 읽기(S) 모드로 잠근 상태에서, 특정 하위 노드 일부만 쓰기(IX) 모드로 변경하겠다는 뜻입니다.
    • 이미 부모 노드 수준에서 하위 전체에 대한 읽기(S) 권한이 보장되어 있으므로, 자식 노드에 다시 IS나 S 로크를 거는 것은 중복(Redundant)이 되어 허용하지 않습니다.
    • 따라서 자식 노드에는 실제로 데이터를 쓰기 위한 X, IX, SIX 로크만 추가로 걸 수 있습니다.


💡 요약 테이블

부모 노드의 로크 상태 자식 노드에 허용되는 (요청 가능한) 로크
IS IS, S
IX IS, S, IX, X, SIX (모두 가능)
SIX IX, X, SIX (IS, S는 중복이므로 제외)

Q. 데이터베이스 병행 제어(Concurrency Control) 기법 중 다중 단위 로킹(Multiple Granularity Locking) 프로토콜에 대한 설명으로 가장 적절하지 않은 것은?

 

① 하위 노드(자식 노드)에 공유 로크(S-lock)를 설정하기 위해서는, 해당 노드의 상위 노드(부모 노드)에 반드시 의도적 공유 로크(IS-lock) 또는 의도적 배타 로크(IX-lock)가 설정되어 있어야 한다.

 

② 하위 노드(자식 노드)에 배타 로크(X-lock)를 설정하기 위해서는, 해당 노드의 상위 노드(부모 노드)에 반드시 의도적 배타 로크(IX-lock) 또는 공유 및 의도적 배타 로크(SIX-lock)가 설정되어 있어야 한다.

 

③ 로크를 획득하는 단계는 최하위 노드(Leaf Node)에서 최상위 노드(Root Node) 방향으로 진행하며, 로크를 해제하는 단계는 최상위 노드에서 최하위 노드 방향으로 순차적으로 진행한다.

 

④ 로크 호환성 행렬(Compatibility Matrix)에 따르면 의도적 배타 로크(IX)는 다른 트랜잭션이 이미 설정한 의도적 공유 로크(IS)와는 호환되지만, 공유 로크(S)와는 호환되지 않아 대기해야 한다.

 

더보기

정답 ③번

 

[해설] 다중 단위 로킹(MGL) 프로토콜 순서

 

③번 보기는 로킹과 해제의 순서를 반대로 설명하고 있습니다.

  • 잠금(Locking) 단계: 반드시 상위(Root) → 하위(Leaf) 순서로 진행해야 합니다.
    • 이유: 하위 노드를 잠그기 전에 상위 노드에 "내가 이 아래에 작업을 할 것이다"라는 표시(Intention Lock)를 미리 해두어야, 다른 트랜잭션이 상위 노드를 통째로 잠그는 것을 방지할 수 있기 때문입니다.
  • 해제(Unlocking) 단계: 반드시 하위(Leaf) → 상위(Root) 순서로 진행해야 합니다.
    • 이유: 하위 작업이 모두 끝나지 않았는데 상위 문을 닫아버리면(해제하면) 데이터 무결성이 깨질 수 있습니다.

[오답 분석] 다른 보기가 맞는 이유

  • ①번 (적절): 하위 노드에 S-lock(읽기)을 걸려면, 상위 노드에는 "읽을 의도(IS)" 또는 "쓰기 의도(IX - 읽기도 포함 가능)"가 있어야 하므로 IS 또는 IX가 설정되어야 합니다.
  • ②번 (적절): 하위 노드에 X-lock(쓰기)을 걸려면, 상위 노드에는 확실한 "쓰기 의도"가 있어야 하므로 IX 또는 SIX가 설정되어야 합니다. (단순 IS는 쓰기 권한이 없으므로 불가)
  • ④번 (적절): IX(의도적 배타) 로크는 다른 트랜잭션의 IS(의도적 공유)와는 호환되지만(서로 다른 데이터를 건드릴 수 있으므로), 이미 전체를 읽고 있는 S(공유) 로크와는 호환되지 않습니다.