본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

다중 단위 로킹(Multiple Granularity Locking, MGL)은 데이터베이스·테이블·페이지·레코드처럼 크기가 다른 데이터 단위를 하나의 계층(트리)으로 보고, 트랜잭션이 필요한 단위에 직접 로크를 걸되 그 상위 단위에는 의도 로크(intention lock)를 걸어 서로 다른 단위의 로크 충돌을 빠르게 판정하는 병행 제어 기법이다.

데이터베이스 로킹에서 로크를 거는 단위가 크면 로크 수가 적어 관리 부담은 작지만 병행성이 떨어지고, 단위가 작으면 병행성은 높지만 로크가 많아진다. 다중 단위 로킹은 한 시스템 안에서 여러 단위를 함께 쓰게 해 이 둘을 절충한다. 테이블 전체를 읽는 트랜잭션은 테이블에 로크 하나만 걸고, 몇 행만 고치는 트랜잭션은 그 행에만 로크를 건다.

문제는 서로 다른 단위의 로크가 겹칠 때이다. 어떤 트랜잭션이 테이블 전체에 공유 로크를 걸려 할 때, 그 테이블의 어느 행에 다른 트랜잭션의 전용 로크가 있는지 모든 행을 뒤져 확인하는 것은 비효율적이다. 그래서 하위 단위에 로크를 거는 트랜잭션은 먼저 상위 단위마다 "아래에서 로크를 걸고 있다"는 표시인 의도 로크를 건다. 상위 단위의 로크만 비교하면 충돌 여부가 드러나므로 하위 노드를 모두 살펴볼 필요가 없다.[1]

기본 로크인 공유(S)·전용(X)에 의도 로크 세 가지가 더해진다.

모드 의미
IS(Intention Shared) 하위 노드 어딘가에 공유 로크만 걸겠다는 표시
IX(Intention eXclusive) 하위 노드 어딘가에 전용 로크(또는 공유 로크)를 걸겠다는 표시
S(Shared) 그 노드와 하위 전체를 읽기 위해 공유 로크를 건다
SIX(Shared and Intention eXclusive) 그 노드 전체에는 공유 로크를 걸고, 하위 노드 일부에는 전용 로크를 걸겠다는 표시. 테이블 전체를 읽으면서 일부 행만 고치는 경우에 쓴다
X(eXclusive) 그 노드와 하위 전체에 전용 로크를 건다

이미 걸려 있는 로크와 새로 요청한 로크가 함께 허용되는지를 나타낸다. '허용'이 아니면 요청한 트랜잭션은 기다린다.[1][2]

요청 \ 기존 IS IX S SIX X
IS 허용 허용 허용 허용 대기
IX 허용 허용 대기 대기 대기
S 허용 대기 허용 대기 대기
SIX 허용 대기 대기 대기 대기
X 대기 대기 대기 대기 대기
  • IX 와 IX 는 함께 허용된다. 두 트랜잭션이 같은 테이블의 서로 다른 행을 고치려는 것일 수 있으므로 상위에서는 막지 않는다. 같은 행이 겹치면 그 행의 X 로크끼리 충돌해 거기서 걸린다. Microsoft 문서도 IX 는 "일부 행만" 갱신하겠다는 뜻이라 IX 끼리 양립한다고 설명한다.[2]
  • IX 와 SIX 는 어느 쪽이 먼저 걸렸든 대기이다. SIX 에는 노드 전체에 대한 S 가 들어 있는데, IX 는 하위 어딘가를 고치겠다는 뜻이므로 S 와 부딪친다.
  • SIX 와 SIX 도 대기이다. 둘 다 하위 일부에 X 를 걸 수 있고, 한쪽의 S(전체 읽기)가 다른 쪽의 쓰기와 부딪친다. SIX 와 함께 허용되는 것은 IS 뿐이다.
  • X 는 어떤 로크와도 함께 허용되지 않는다.

로크 획득 규칙

편집 원본 편집

트랜잭션 T 가 노드 Q 에 로크를 걸 때 지키는 규칙이다.[1]

  1. 양립성 행렬을 지킨다.
  2. 트리의 루트에 먼저 로크를 건다. 루트에는 어떤 모드든 걸 수 있다.
  3. Q 에 S 나 IS 를 걸려면 T 가 Q 의 부모에 IX 나 IS 를 걸고 있어야 한다.
  4. Q 에 X, SIX, IX 를 걸려면 T 가 Q 의 부모에 IX 나 SIX 를 걸고 있어야 한다.
  5. 2단계 로킹 규약을 따른다. 한 번이라도 로크를 풀었으면 새 로크를 걸지 않는다.
  6. Q 의 자식 중 T 가 로크를 건 것이 남아 있으면 Q 의 로크를 풀지 않는다.

그래서 로크는 루트에서 잎 방향으로 걸고, 잎에서 루트 방향으로 푼다. 한 단위에 로크가 너무 많아지면 상위 단위의 S·X 로크 하나로 바꾸는 로크 상승(lock escalation)을 쓰기도 한다.

테이블 EMP 의 행 r1 을 고치는 트랜잭션 T1 은 데이터베이스와 EMP 에 IX, r1 에 X 를 건다. 이때

  • EMP 의 행 r2 를 고치려는 T2 는 EMP 에 IX(기존 IX 와 허용), r2 에 X 를 걸어 함께 진행한다.
  • EMP 전체를 읽으려는 T3 은 EMP 에 S 를 요청하지만 기존 IX 와 충돌해 기다린다. 행을 하나씩 확인하지 않고도 충돌을 안다.
  • EMP 전체를 읽으며 일부를 고치려는 T4 는 EMP 에 SIX 를 요청하지만 역시 기존 IX 와 충돌해 기다린다.

단일 단위 로킹과 구별하기

편집 원본 편집
구분 단일 단위 로킹 다중 단위 로킹
로크 단위 시스템 전체가 한 단위(행이나 테이블)를 쓴다 트랜잭션마다 알맞은 단위를 고른다
로크 모드 S, X S, X 에 IS, IX, SIX 가 더해진다
충돌 판정 같은 단위끼리만 비교 상위 노드의 의도 로크로 하위 충돌을 미리 안다
병행성과 부담 단위를 크게 하면 병행성 저하, 작게 하면 로크 관리 부담 증가 둘을 절충
  1. ↑ 1.0 1.1 1.2 「Chapter 18: Concurrency Control」, Database System Concepts 7th Edition 강의자료, Silberschatz·Korth·Sudarshan, https://www.db-book.com/slides-dir/PDF-dir/ch18.pdf, 확인일: 2026-11-04.
  2. ↑ 2.0 2.1 「Transaction locking and row versioning guide - Lock compatibility」, Microsoft Learn, https://learn.microsoft.com/en-us/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide, 확인일: 2026-11-04.