Lock Compatibility Matrix
**락 호환성 매트릭스 (Lock Compatibility Matrix, LCM)**는 트랜잭션이 리소스 (레코드/페이지/테이블) 를 특정 모드로 잠글 때, 다른 트랜잭션의 잠금 요청을 허용·대기·거부로 즉시 판정하는 규칙표다.
기본 모드는 S(공유)·**X(배타)**이며, 다중 그레뉼러리티에서 상·하위 객체를 안전히 함께 잠그기 위해 **IS/IX/SIX(의도 락)**을 사용한다.
일부 DBMS 는 갱신 경합을 줄이려 U(Update) 같은 확장 모드를 둔다.
Lock Compatibility Matrix(LCM) 은 격리 수준 (특히 2PL 기반 RC/RR/Serializable) 구현과 락 에스컬레이션·타임아웃·교착 탐지의 핵심 근거다.
MVCC 환경에서도 쓰기 충돌·직렬가능성 (예: 프레디킷/범위 잠금) 보장을 위해 잠금이 병행 활용된다.
실무에선 ’ 읽기 대부분 ’ 워크로드에 S/IS 허용 폭을 넓히고, 쓰기 집중 구간에 X/IX 경합을 줄이도록 인덱스·범위 (갭/키 - 범위) 잠금 전략, 에스컬레이션 임계치, 트랜잭션 크기·재시도 정책을 조정해 지연과 교착을 최소화한다.
락 호환성으로 여는 고성능 트랜잭션
여러 트랜잭션이 같은 데이터를 동시에 만질 때, 어떤 조합은 함께 가능 (호환) 하고 어떤 조합은 누군가 기다려야 (비호환) 해. 이 규칙표가 락 호환성 매트릭스야.
데이터는 테이블 → 레코드처럼 계층이라서, 아래에서 잠글 계획이면 위 (테이블) 에도 의도 락으로 알려줘야 충돌을 빨리 판단할 수 있어.
범위로 읽거나 쓸 때는 팬텀 (새 레코드가 끼어드는 현상) 을 막으려 범위 자체를 잠그는 방식 (키 - 범위/넥스트키/프레디케이트) 을 써.
이 모든 규칙을 지키면서 시스템은 속도를 최대화하고 (동시성), 잘못된 결과를 막아 (일관성). 제품마다 구현이 조금씩 달라서, 사용하는 DB 의 방식을 알아두면 장애 원인 파악과 튜닝이 쉬워져.
LCM 핵심 개념 일람
- 기본
- 락 모드 (S/X/NL): 읽기 공유 (S), 쓰기 배타 (X), 무 (Null, NL).
왜: 동시 읽기 허용·쓰기 충돌 차단의 최저 단위. - 호환성 매트릭스 (LCM): 보유 락 vs 요청 락의 즉시 판정표.
왜: 블로킹 여부를 O(1) 로 결정.
- 락 모드 (S/X/NL): 읽기 공유 (S), 쓰기 배타 (X), 무 (Null, NL).
- 실무
- 의도 락 (IS/IX/SIX): 하위 리소스 잠금 의도 표시.
왜: 테이블↔레코드 계층 잠금 충돌을 빠르게 탐지. - 락 에스컬레이션: 다수의 미세 락→상위 그라뉼러리티로 승격.
왜: 메모리·메타데이터 부담 감소.
- 의도 락 (IS/IX/SIX): 하위 리소스 잠금 의도 표시.
- 심화
- 범위 기반 잠금: Key-Range/넥스트키/프레디케이트.
왜: 팬텀 방지 (범위 질의의 직렬성 보장). - 제품별 특수 모드: SQL Server 의 U 락, PostgreSQL 테이블 락 모드군.
왜: 데드락 저감·DDL/스키마 보호.
- 범위 기반 잠금: Key-Range/넥스트키/프레디케이트.
- 격리 수준과의 상호작용: RC/RR/Serializable 에 따라 필요한 락 범위·기간이 달라짐.
왜: 성능↔일관성 트레이드오프 관리.
| 개념 (한글·약어) | 정의 | 왜 중요한가 | 대표 구현/참조 |
|---|---|---|---|
| 락 호환성 매트릭스 (LCM) | 락 모드 간 동시 허용 여부를 표로 정의 | 블로킹/대기·경합 예측 및 제어 | PG/SQL Server 공식 문서의 호환 표 |
| 공유 락·배타 락 (S/X) | 읽기 공유/쓰기 배타 | 읽기 동시성↑/쓰기 충돌 차단 | 모든 RDBMS 공통 |
| 의도 락 (IS/IX/SIX) | 하위 리소스 잠금 의도 표기 | 계층 충돌 O(1) 판정·스캔 성능 | MGL 위키·교과 참고 |
| 널 락 (NL) | 내부적 " 무 " 락 | 호환성 판단 단순화 | SQL Server 문서 |
| 업데이트 락 (U) | S→X 전환 충돌 완화 | 데드락 저감 | SQL Server 문서 |
| 범위 잠금 (Key-Range/넥스트키/프레디케이트) | 인덱스 범위·조건에 대한 잠금 | 팬텀 방지·직렬성 확보 | SQL Server 키 - 범위, MySQL 넥스트키, PG SIREAD |
| 락 에스컬레이션 | 미세 락→상위로 승격 | 메모리·메타데이터 부담 완화 | MGL·제품 가이드 |
| 격리 수준 (RC/RR/SR/SI) | 트랜잭션 간 보장 수준 | 성능↔일관성 트레이드오프 | 강의 노트 |
LCM 은 즉시 판정 규칙표이고, 의도 락·에스컬레이션은 계층 관리 비용과 충돌 판정 속도를 개선한다. 팬텀 방지는 제품별 범위 기반 잠금 방식이 다르므로 튜닝·장애 분석 시 제품 문서를 반드시 참조해야 한다.
LCM 구성요소 상호작용 지도
- 격리 수준이 요구하는 일관성 수준 → 범위 잠금/의도 락 전략 선택 → LCM으로 즉시 호환성 판정 → 결과로 블로킹/대기 발생 → 과도 시 에스컬레이션/타임아웃/우선순위 조정 적용.
| 출발 → 도착 | 방향/의미 | 무엇을 위해 | 메모 (제품 차이) |
|---|---|---|---|
| 격리 수준 → 범위 잠금 | 요구 일관성↑ ⇒ 강한 범위 제어 | 팬텀 방지·직렬성 | PG=SIREAD, SQLS=Key-Range, MySQL=넥스트키 |
| 의도 락 → LCM 판정 | 상위에서 하위 계획 신호 | 계층 충돌 O(1) 판정 | MGL 규칙 (격자형 호환) |
| 인덱스 설계 → 범위 잠금 범위 | 스캔 패턴 결정 | 경합 최소화 | InnoDB 는 " 스캔된 인덱스 범위 " 에 잠금 |
| LCM 판정 → 블로킹/대기 | 비호환 시 대기 | 안정성/일관성 확보 | 모든 DBMS 공통 |
| 경합 증가 → 에스컬레이션 | 미세 잠금 폭주 완화 | 운영 비용 절감 | 정책·임계치 제품별 상이 |
요구 일관성 수준이 강할수록 범위 잠금의 강도가 올라가고, 이는 인덱스·쿼리 패턴과 맞물려 경합을 좌우한다. 의도 락은 이 모든 과정을 LCM으로 빠르게 판정하게 만드는 접착제 역할을 한다.
LCM 기반 실무 적용 매핑
- 성능 튜닝: 인덱스 설계·범위 질의 최적화로 범위 잠금 영역 최소화 → 경합 감소.
- 운영 안정성: 대기열·타임아웃·교착 탐지 정책으로 긴 대기/순환 대기 완화.
- 스키마 작업: 테이블 락 모드 이해로 DDL 충돌 회피(예: ACCESS EXCLUSIVE 와의 충돌).
- 제품별 디버깅: PostgreSQL 의 SIREAD 보기는 " 대기 원인 " 이 아님을 이해 → 잘못된 원인 추정 방지.
| 상황 (무엇) | 적용 방법 (어떻게) | 기대 효과/리스크 (왜) | 체크포인트/지표 |
|---|---|---|---|
| 범위 질의 팬텀 발생 | 적절한 인덱싱 + 제품별 범위 잠금 이해 (키 - 범위/넥스트키/SIREAD) | 직렬성 보장, 삽입 팬텀 제거 | 실행계획 스캔 범위·락 대기 시간 |
| 갱신 경합·데드락 | SQL Server 의 U 락/락 순서 정규화 | 교착 가능성 감소 | 데드락 그래프·대기 타임아웃 |
| 대량 배치·ETL | 에스컬레이션 임계/배치 크기 조정 | 메모리·락 테이블 부담 경감 | 락 수·메타데이터 사용량 |
| DDL 과 DML 충돌 | 테이블 락 모드 충돌 표 확인 후 순서 조정 | 운영 중단·대기 급증 방지 | PG 테이블 락 모드 충돌 매트릭스 확인 |
| 읽기 지연 급증 | 인덱스 재설계로 스캔 범위 축소 | 범위 잠금 면적↓ → 경합↓ | InnoDB 스캔 - 락 상관 확인 |
실무에서는 쿼리 패턴×인덱스×제품별 범위 잠금의 조합이 체감 성능을 좌우한다. LCM 을 전제로, 락 순서/정책/임계치를 조정하면 교착·경합을 크게 줄일 수 있다.
기초 조사 및 개념 정립
락 호환성 매트릭스, 제대로 이해하기
- 정의 한 줄: 락 호환성 매트릭스는 두 락 모드가 같은 자원에서 동시에 가능하냐를 보이는 표다.
- 왜 중요한가: 트랜잭션이 많아질수록 충돌을 빠르게 판정해야 성능과 일관성을 지킬 수 있다.
- 가장 단순한 규칙:
S끼리는 함께 가능,X는 혼자만 가능. - 조금 더 나아가: 계층 구조 (테이블→행) 에서는 IS/IX/SIX 같은 의도 락으로 " 하위에서 잠글 계획 " 을 상위에 알려 충돌 탐색을 최적화한다.
- 실무 팁: 사용 중인 DBMS 의 공식 호환성 표를 즐겨찾기해두고, 설계·튜닝·장애 분석 때 항상 참조하라.
락 호환성: 정의·원리·맥락
락 호환성 매트릭스 (정의)
동일 자원에 대해 현재 보유된 락 모드와 새로 요청되는 락 모드의 동시 보유 가능성을 나타내는 2 차원 불린 (Boolean) 표다. 원소 M[i][j] 는 " 모드 i 가 보유 중일 때 모드 j 를 부여해도 되는가 " 를 의미한다. 이 표는 DBMS 의 락 부여 결정 규칙으로 동작한다.
운영 원리
DBMS 는 락 요청을 받을 때 자원·모드·보유 현황을 확인하고, 매트릭스를 조회해 허용/비허용을 즉시 판정한다. 허용이면 락을 부여하고, 비허용이면 대기열에 넣거나 에러를 낸다 (데드락 탐지/타임아웃 정책과 결합).
- DBMS 의 판단 절차 (개념)
- 요청 자원 R 과 모드 m 확인
- R 에 보유 중인 모든 모드 h 에 대해
M[h][m]을 검사 - 전부 호환이면 grant, 하나라도 비호환이면 wait/deny (추가로 대기열·데드락 탐지/타임아웃 정책 작동).
기본 예시 (S/X)
공유 (S) 는 다른 공유와는 호환되지만 배타 (X) 와는 비호환이다. 배타 (X) 는 어느 모드와도 호환되지 않는다. 이 간단한 규칙만으로도 읽기 - 읽기 동시성과 쓰기 고립을 설명할 수 있다.
| 보유\요청 | S | X |
|---|---|---|
| S | ✔ | ✖ |
| X | ✖ | ✖ |
→ S 는 S 와만 호환, X 는 어떤 락과도 비호환이다.
의도 락과 계층
테이블·페이지·행 같은 다단계 자원에서는 **의도 락 (IS/IX/SIX)**을 상위 노드에 부여해 하위 노드에서의 잠금 계획을 알린다. 덕분에 상위 수준에서 광역 충돌 탐색을 빠르게 하고, 락 에스컬레이션 같은 정책과도 자연스럽게 맞물린다. 대표 호환성은 위 표와 같으며, 예컨대 IX 는 S/SIX 와 비호환이다.
| 보유\요청 | IS | IX | S | SIX | X |
|---|---|---|---|---|---|
| IS | ✔ | ✔ | ✔ | ✔ | ✖ |
| IX | ✔ | ✔ | ✖ | ✖ | ✖ |
| S | ✔ | ✖ | ✔ | ✖ | ✖ |
| SIX | ✔ | ✖ | ✖ | ✖ | ✖ |
| X | ✖ | ✖ | ✖ | ✖ | ✖ |
MVCC 와의 관계
MVCC 시스템 (예: PostgreSQL) 은 다수의 읽기와 쓰기를 행 버전으로 분리해 충돌을 줄이지만, 명시적 테이블 락/DDL 락 등에는 여전히 호환성 매트릭스가 적용된다. 즉, MVCC 는 행 버전 관리, 매트릭스는 락 부여 규칙으로 서로 다른 층위의 메커니즘이다.
제품별 차이 유의
SQL Server, DB2 등은 U/Sch-S/Sch-M/Z 같은 추가 모드를 정의하며, 공식 표가 곧 진실의 원천이다. 개념은 동일하지만 모드·세부 호환성은 제품별 문서로 확인한다.
락 호환성 매트릭스: 배경과 진화
- 왜 필요? 동시에 읽고 쓰는 트랜잭션이 서로 방해하지 않게 하려면, 어떤 락이 함께 허용/금지되는지 표로 정의해야 한다 (= 호환성 매트릭스).
- 어떻게 발전?
- 초기 S/X + 2PL: 단순·강력하지만 읽기 성능 저하·데드락·팬텀 이슈. → 일관성의 최소 요건을 제시.
- 의도 락·MGL: 트리형 자원에 다층 잠금 적용 시 부모/조상 충돌을 신속 탐지하여 락 수·충돌·오버헤드를 줄임. SIX 등 확장 모드로 대량 읽기 + 부분 쓰기 혼합 워크로드 최적화.
- 팬텀 대응의 실용화: 프레디케이트 락의 비용 문제 → 키 - 레인지/넥스트 - 키 락으로 삽입·삭제 팬텀까지 차단, 직렬 가능 격리 구현 용이.
- MVCC와 결합해 읽기 성능 향상, 필요시 범위잠금/SSI로 직렬 가능 보장.
- 실무 포인트: 락 모드 이름은 DB 마다 달라도 매트릭스가 본질. 호환/비호환만 정확히 이해하면 다른 엔진으로도 이식이 쉽다.
등장 배경
- 1960–70 년대 다중 사용자 DBMS 가 보편화되며, 동시성·일관성·성능을 동시에 만족시킬 제어가 요구됐다. 2PL은 " 락을 해제한 뒤에는 새 락을 요청하지 않는다 " 는 간명한 규칙으로 직렬 가능성을 충분조건으로 보장했다. 그러나 읽기 전용 트랜잭션의 차단, 팬텀(범위 질의 재실행 시 새로운 행이 나타나는 현상), 데드락 등의 부작용이 명확했다.
- 트리형 저장구조 (B-Tree 인덱스 등) 가 보편화되자, 상위 노드와 하위 노드 잠금 간 충돌을 빠르게 탐지하고 불필요한 전체 락을 피하려는 요구가 커졌다. 이것이 의도 락·MGL과 호환성 매트릭스의 확장으로 이어졌다.
발전 과정
| 시기 | 핵심 제안/기술 | 왜 등장했나 | 무엇이 개선되었나 (매트릭스 관점) |
|---|---|---|---|
| 1976 | 2PL + 프레디케이트 락(EGLT) | 직렬 가능성 보장, 범위 질의의 팬텀 이론적 차단 | S/X 호환성의 기본 축 정립, 범위 충돌을 개념적으로 포함. |
| 1976 | 의도 락 (IS/IX/SIX) + MGL(Gray) | 계층 자원에 안전·효율 잠금 필요 | 조상 노드와의 충돌을 매트릭스로 빨리 판정, 대량 읽기 + 부분 쓰기에 SIX로 최적화. |
| 1980s–1990s | 키 - 레인지/넥스트 - 키 락 | 프레디케이트 락의 고비용·미구현 문제 해결 | 삽입·삭제 팬텀까지 호환성 표에 반영 (레인지 단위 충돌). InnoDB 의 넥스트 - 키가 대표. |
| 1990s–2000s | MVCC/스냅샷 격리 | 읽기 비차단·고성능 읽기 | 읽기 경합 감소. 다만 Serializable 보장엔 범위잠금/SSI가 보완. |
| 2000s–현재 | 엔진별 확장(예: SQL Server 키 - 레인지, Postgres 충돌 매트릭스, Spanner 의 락 기반 RW 트랜잭션) | 워크로드·분산 요구 대응 | 모드 명칭은 달라도 매트릭스 기반 판단은 동일. 운영·튜닝 지표로 정착. |
timeline
title 락 호환성 매트릭스의 등장과 진화
1960s-1970s : 다중 사용자 DBMS 보급 · S/X 잠금 확산
1976 : 2PL 정식화 · 프레디케이트 락 제안(팬텀 이론적 차단)
1976 : 의도 락(IS/IX/SIX) · MGL 도입(계층 락킹·호환성 확장)
1980s-1990s : 키-레인지/넥스트-키 락(프레디케이트의 실용화)
1990s-2000s : MVCC/스냅샷 격리 확산(읽기 비차단) → Serializable엔 범위잠금/SSI 병행
2000s-Now : 엔진·클라우드별 모드 다양화(이름은 달라도 매트릭스는 본질)
Note 1976 : 문제점 보완 포인트 — 계층 충돌 탐지·락 수 감소 필요 → 의도 락·SIX로 개선
Note 1990s : 문제점 보완 포인트 — 프레디케이트 구현 난이도·오버헤드 ↑ → 키-레인지/넥스트-키로 현실화
Note Now : 운영 포인트 — 모드명 다름·락 에스컬레이션·데드락 관찰 필요(매트릭스 기반 튜닝)
- 핵심 축은 언제나 **" 어떤 모드가 공존 가능한가 “**다. 이름이 아니라 호환성 매트릭스가 본질이다.
- 이론 → 실용 전환의 핵심은 팬텀 방지를 키 - 레인지/넥스트 - 키로 구현해 **매트릭스에 " 범위 단위 충돌 “**을 반영한 점이다.
- MVCC는 읽기 경합을 줄였지만, 직렬 가능이 목표라면 범위잠금/SSI와 함께 설계해야 한다.
동시성 품질을 높이는 락 매트릭스 전략
락 호환성 매트릭스는 특정 잠금 모드끼리가 함께 잡혀도 되는지, 아니면 서로 막는지를 표로 정리한 것이다.
이 표를 기준으로 읽기·쓰기 작업의 조합을 설계하면 더티리드·팬텀 같은 문제를 피하면서도 불필요한 대기를 줄일 수 있다.
나아가 의도락과 키 - 범위 락을 적절히 사용하면 대용량 환경에서도 예측 가능한 성능과 일관성을 확보할 수 있다.
락 호환성 매트릭스의 목적과 효용
- 동시성 vs 일관성 딜레마: 모드 조합의 허용/충돌을 표로 명시해 불필요한 직렬화를 줄이면서 ACID 일관성 요구를 충족.
- 락 충돌·대기: S/X/U/의도락 (IS/IX/SIX)·키범위락 등 조합을 사전 설계해 대기열과 타임아웃을 감소.
- 팬텀·더티·반복불가능 읽기: 격리수준과 호환 규칙을 결합해 팬텀 방지 (키 - 범위), 더티/NRR 억제.
- 데드락 위험: 자원 획득 순서·모드 선택을 일관화하여 순환대기 가능성을 낮춤 (탐지·해결은 별도 메커니즘).
- 자원 활용 저하: 읽기 - 읽기 호환을 넓히고 그라뉼러리티를 조정해 처리량 향상.
락 매트릭스로 풀어내는 대표 문제들
| 문제 | 주된 원인 | 매트릭스가 하는 일 | 개선/효과 | 관련 기능/예시 |
|---|---|---|---|---|
| 더티 리드 | 갱신 중인 행을 다른 트랜잭션이 읽음 | S/X/U 호환 규칙으로 읽기 - 쓰기 충돌 차단 | 데이터 일관성 보장 | S vs X 비호환 규칙 |
| 반복 불가능 읽기 | 동일 행을 재조회 시 값 변경 | 읽기 락 유지·호환 제한 | 재조회 일관성 향상 | Repeatable Read 설계 |
| 팬텀 리드 | 범위 조회 후 신규 행 삽입 | 키 - 범위 락 호환 규칙 적용 | 범위 일관성 확보 | SERIALIZABLE+Key-Range |
| 과도한 대기/타임아웃 | 불필요한 비호환 조합 | 호환 가능한 모드 채택·순서 정립 | 처리량↑, 지연↓ | IS/IX/SIX 설계 |
| 데드락 위험 | 순환 대기 | 자원 획득 순서·모드 단순화 | 발생 확률 감소 | 블로킹 원인 분석 지침 |
매트릭스는 어떤 조합이 막히는지 명확히 보여줌으로써 더티/팬텀 등 이상 현상을 억제하고, 대기·데드락을 줄여 처리량과 안정성을 함께 끌어올린다.
락 매트릭스의 핵심 목적과 달성 수단
| 목적 | 설명 | 설계/운영 포인트 | 참고 지표·도구 |
|---|---|---|---|
| 일관성 보장 | 트랜잭션 격리 요구 충족 | 키 - 범위 락, 모드 호환성 준수 | 팬텀/NRR 발생률, 실패 케이스 |
| 성능 최적화 | 불필요한 직렬화 제거 | 의도락·그라뉼러리티 조정 | 평균 대기, 처리량, 타임아웃 |
| 예측 가능성 | 규칙 기반 사전 설계 | 자원 획득 순서 표준화 | 변경 전후 충돌 행렬 비교 |
| 운영 가시성 | 문제 진단·튜닝 | DMV/뷰 모니터링 | sys.dm_tran_locks, Locks 카운터 |
목적 달성은 호환 규칙 준수, 적절한 락 모드·범위 선택, 모니터링·피드백 루프 구축이 핵심이다.
문제와 목적의 1:1·N:M 연결성
| 문제 → 목적 | 일관성 보장 | 성능 최적화 | 예측 가능성 | 운영 가시성 |
|---|---|---|---|---|
| 더티/반복불가/팬텀 | 높음 | 중간 | 중간 | 낮음 |
| 충돌·대기 | 중간 | 높음 | 높음 | 중간 |
| 데드락 위험 | 중간 | 중간 | 높음 | 중간 |
| 자원 활용 저하 | 낮음 | 높음 | 중간 | 낮음 |
이상 현상은 주로 일관성과 직결, 대기·데드락·자원 이슈는 성능·예측 가능성과 강하게 연결된다.
LCM 실전 적용 핵심 요건 정리
LCM(락 호환성 매트릭스) 은 " 지금 이 락을 줘도 되는가?” 를 즉시 판정하는 규칙표다.
제대로 쓰려면 먼저 2PL 같은 직렬화 보장 방식을 전제로 하고, 격리 수준에 맞춰 어떤 잠금을 쓰는지 알아야 한다.
예를 들어 READ COMMITTED 이상에서는 쓰기 충돌은 항상 조정되고, SERIALIZABLE 에서는 팬텀을 막기 위해 인덱스 키 - 범위/갭 잠금이 필요하다.
테이블 - 페이지 - 레코드처럼 여러 단계의 락 단위를 쓰면 의도 락 (IS/IX/SIX) 규칙이 들어가 충돌 판단이 더 정교해진다.
내부적으로는 락 테이블과 대기 큐를 다루는 락 관리자가 있고, 이 자료구조를 보호하는 래치가 필요하다.
또한 데드락이 생길 수 있으므로 탐지나 예방, 타임아웃 정책이 준비돼 있어야 한다.
마지막으로 DBMS 마다 구현이 다르니 (예: PostgreSQL 의 호환 표, SQL Server 의 키 - 범위, InnoDB 의 갭/넥스트키, Oracle 의 MVCC) 제품별 문서를 참고해 운영 환경에 맞게 조정한다.
LCM 적용을 위한 필수 전제·요구
기술적 전제 조건
- 2PL 또는 동등 직렬화 보장: 충돌 직렬가능성을 보장하기 위해 성장/축소 단계 구분이 필요하며, LCM 은 각 단계에서 허용/대기/거부 판정의 근거가 됨.
근거: 2PL 직렬화 정리 - 격리 수준과 범위 잠금: RC 이상에서 읽기/쓰기 충돌을 판정, SERIALIZABLE 에선 팬텀 방지용 키 - 범위/갭 잠금 규칙이 요구됨.
근거: key-range/next-key 공식 문서 - 다중 그레뉼러리티와 의도 락: 테이블→페이지→레코드 계층에서 상·하위 객체 보호를 위해 IS/IX/SIX 규칙이 필요.
근거: 계층적 락킹 규칙
시스템 요구사항
- 락 관리자와 래치: 락 테이블/큐 조작의 원자성을 위한 래치가 필요, 없으면 레이스로 LCM 판정이 깨짐.
근거: 락 매니저 구현 논의 - 메모리·스케줄링: 리소스/범위/메타데이터 잠금 증가에 대비한 메모리와 공정한 대기 큐 정책이 필요.
근거: 잠금 리소스 유형 - 데드락 처리: 탐지 (주기적/사건 기반) 또는 예방 (wait-die, wound-wait), 타임아웃 병행.
근거: 고전적 처리 전략
학습/환경 전제
- 트랜잭션·격리·인덱스 구조 이해
- 벤더 차이 인지: PostgreSQL(명시적/행락 호환 표), SQL Server(행·키 - 범위 호환 표), InnoDB(갭/넥스트키), Oracle(MVCC+ 락) 특성 차이를 인지.
근거: 각 공식 문서
LCM 전제·요구 체크리스트
| 구분 | 항목 | 왜 필요한가 (근거) | 구현 포인트/예시 |
|---|---|---|---|
| 전제 | 2PL 또는 동등 직렬화 | 충돌 직렬가능성, 락 판정의 의미 확보 | 성장/축소 단계 준수, 업그레이드 교착 주의 |
| 전제 | 격리 수준 설정 | RC 이상 충돌 제어, SERIALIZABLE 팬텀 방지 필요 | Key-range/next-key 활성화 |
| 전제 | 다중 그레뉼러리티 | 상·하위 객체 동시 보호 | IS/IX/SIX 규칙 적용, 에스컬레이션 안전화 |
| 시스템 | 락 관리자 래치 | 락 테이블 원자성·일관성 | 내부 동기화 (세마포어/래치) 설계 |
| 시스템 | 메모리/큐 | 리소스·범위 잠금 수 증가 대응 | 락 유형별 메모리 캡·모니터링 |
| 시스템 | 데드락 처리 | 순환 대기 해소 | 탐지 (그래프)/예방 (wait-die/wound-wait)/타임아웃 |
| 환경 | 벤더 차이 | 호환 표·락 모드 상이 | PostgreSQL/SQL Server/InnoDB/Oracle 문서 준거 |
LCM 을 실무에 적용하려면 **직렬화 보장 (2PL), 격리 수준별 잠금 규칙, 다중 그레뉼러리티 (의도 락)**가 전제돼야 한다. 운영 측면에선 락 관리자 동기화·메모리·데드락 처리가 필수이며, 제품마다 호환성 표와 잠금 모드가 달라 공식 문서를 기준으로 매개변수를 조정해야 안정적인 동시성과 일관성을 얻는다.
관련 기술과의 차별점
- vs MVCC 단독: MVCC 는 읽기 일관성을 버전으로 해결하지만 쓰기/범위 충돌 판정은 결국 락/LCM 규칙을 함께 사용.
- vs 단일 그레뉼러리티 락: 의도 락 없는 단일 레벨은 에스컬레이션/동시성에 취약. LCM 은 IS/IX/SIX 로 충돌 판정과 에스컬레이션 안전성을 동시에 달성.
- vs 낙관적/타임스탬프 기법: 사후 검증/재시도 중심이라 LCM 기반의 사전 차단과 운영 특성이 다름 (충돌이 잦을수록 LCM 유리). 일반 이론 대비 관점
락 호환성 매트릭스 핵심
- 무엇: LCM 은 “어떤 락끼리 동시에 가능인지” 를 미리 표로 정해둔 판정 규칙이야.
- 왜: 요청이 들어올 때마다 즉시 블로킹 여부를 빠르게 판단해서 성능과 일관성을 동시에 잡기 위해.
- 어떻게:
- 리소스가 계층 (테이블→레코드) 이라서 **의도 락 (IS/IX/SIX)**으로 상·하위 충돌을 빠르게 거른다.
- 범위 쿼리의 팬텀은 제품별 범위 잠금(SIREAD/키 - 범위/넥스트키) 으로 막는다.
- 같은 격리수준이라도 엔진이 여러 잠금 전략 중 하나를 골라 쓸 수 있다.
LCM 핵심 특징: 근거와 차이점
표 기반 즉시 판정
- 근거: 각 DBMS 의 호환성 표/규칙 제공.
- 차별점: 단일 뮤텍스와 달리 S/X/의도락 등 모드 조합을 구체 규칙으로 처리.
대칭적 호환성
- 근거: 호환성 행렬은 대칭임 (고전 정리).
- 차별점: " 요청↔보유 순서 " 와 무관하게 결과 동일—판정 단순화.
MGL/의도 락
- 근거: IS/IX/SIX 정의와 조합 표, 에스컬레이션 규칙.
- 차별점: 대규모 트리 구조에서 탐색·판정 비용 최소화.
범위 기반 잠금 (팬텀 방지)
- 근거: PostgreSQL SIREAD(차단·데드락 미유발), SQL Server 키 - 범위, MySQL 넥스트키.
- 차별점: 단순 행잠금 대비 삽입/삭제로 생기는 팬텀까지 차단.
엔진 선택성 (격리 충족 내 최적화)
- 근거: 직렬화 격리에서도 잠금 형태는 엔진이 선택.
- 차별점: " 격리수준=특정잠금 " 고정관념을 깨고 워크로드 적응.
에스컬레이션
- 근거: MGL 의 승격 메커니즘.
- 차별점: 락 수/메모리 제어로 운영 안정성 확보.
MVCC/버저닝·OCC 와의 대비
- 근거: SQL Server 락·버저닝 가이드.
- 차별점: 사전 차단 (LCM) vs 사후 검증 (OCC)/버전 격리 (MVCC).
락 호환성 핵심 특징 표
| 특징 | 설명 (요지) | 기술적 근거 | 다른 기술 대비 차별점 |
|---|---|---|---|
| 표 기반 즉시 판정 | 호환성 표로 보유/요청 조합을 상수 시간에 판정 | SQL Server/PG 문서의 호환 규칙 | 모드 조합 규칙을 정형화 (뮤텍스 대비 정밀) |
| 대칭적 호환성 | 호환성은 대칭 관계 | Korth 정리 (행렬 대칭) | 요청/보유 순서 무관 동일판정 |
| MGL/의도 락 | IS/IX/SIX 로 계층 충돌 빠른 차단 | MGL 정의·호환성 표 | 대규모 트리 구조에서 탐색·판정 비용↓ |
| 범위 기반 잠금 | 팬텀 방지 위한 범위 보호 | PG SIREAD, SQLS 키 - 범위, MySQL 넥스트키 | 행잠금만으로 못 막는 삽입/삭제 팬텀 차단 |
| 엔진 선택성 | 격리 충족 내에서 잠금 전략 선택 | SQL Server 직렬화 해설 | " 격리=특정잠금 " 고정관념 교정, 워크로드 적응 |
| 에스컬레이션 | 미세 락→상위 락 승격 | MGL 승격 원리 | 락 수/메모리 제어로 안정성↑ |
| MVCC/OCC 대비 | 비관적 제어의 핵심, 즉시 차단 | 락·버저닝 가이드 | 사전 차단 vs 사후 검증/버전 격리 |
LCM 은 표 기반 판정과 **계층 제어 (MGL)**를 결합해 빠른 충돌 판정과 운영 비용 제어를 동시에 달성한다. 팬텀 방지는 제품별 범위락 전략으로 구현되며, 같은 격리수준이라도 엔진 선택성으로 잠금 패턴은 달라질 수 있다.
호환성 매트릭스 읽기 (S/IS/IX/SIX/X) 와 기본 파이프라인 (요청→판정→대기/해제)
락 모드 핵심 요약
- S(Shared): 읽기용. 다른 S 와 공존 가능.
- X(Exclusive): 쓰기용. 어떤 락과도 공존 불가.
- IS(Intention Shared): " 하위 레벨에서 S 를 잡을 의도 " 신호.
- IX(Intention Exclusive): " 하위 레벨에서 X 를 잡을 의도 " 신호.
- SIX(Shared + Intention Exclusive): 현재 노드는 S, 하위에선 일부 X 예정 (대량 읽기 + 부분 수정에 좋음).
의도 락 (IS/IX/SIX) 은 계층 (DB→스키마→테이블→페이지→행) 환경에서 " 아래에서 무슨 락을 잡을지 " 를 상위 노드에 미리 알리는 신호다.
호환성 매트릭스 읽는 법 (3 단계)
- **요청 락 (행)**을 행 (가로줄) 에서 찾는다.
- **이미 보유 중인 락 (열)**을 열 (세로줄) 에서 찾는다.
- 모든 보유 락과 “✔(허용)” 이어야 부여 가능. 하나라도 “✘(충돌)” 이면 대기.
| 요청\보유 | IS | IX | S | SIX | X |
|---|---|---|---|---|---|
| IS | ✔ | ✔ | ✔ | ✔ | ✘ |
| IX | ✔ | ✔ | ✘ | ✘ | ✘ |
| S | ✔ | ✘ | ✔ | ✘ | ✘ |
| SIX | ✔ | ✘ | ✘ | ✘ | ✘ |
| X | ✘ | ✘ | ✘ | ✘ | ✘ |
빠른 감각
- IS/IX 끼리는 대체로 호환(신호만 보내는 수준).
- S/X/SIX 는 실제 데이터 충돌에 민감해 호환성이 낮다.
- X 는 최강—거의 전부와 충돌.
계층적 잠금 (MGL) 에서의 적용 규칙
- 상위→하위 순서로 의도 락부터: 예) 행에 X 를 잡고 싶다면 DB/스키마/테이블에 IX→…→행 X.
- 상위 노드에서 IS↔IX 는 호환이므로 서로 다른 트랜잭션이 같은 테이블에서 " 읽기용 하위 락 " 과 " 쓰기용 하위 락 " 을 서로 다른 범위에서 동시에 진행할 수 있다.
기본 파이프라인 (요청→판정→대기/해제)
flowchart TD
A["락 요청(M on R)"] --> B{보유 락 존재?}
B -- NO --> C["Grant(즉시 부여)"]
B -- YES --> D[호환성 매트릭스 검사]
D -- 호환 ✔ --> C
D -- 충돌 ✘ --> E[대기 큐 등록]
E --> F{데드락 탐지/예방}
F -- 사이클 발견 --> G[희생 TX 롤백]
F -- 미발견 --> H[기존 락 해제 대기]
C --> I[작업 수행]
I --> J{업그레이드/에스컬 필요?}
J -- YES --> D
J -- NO --> K[커밋/롤백]
K --> L[보유 락 해제]
L --> M[대기 큐 재평가·가능 요청 Grant]
설명 포인트
- Grant는 " 요청 락이 현재 보유 락들과 전부 호환 " 일 때.
- 충돌이면 대기 큐로 들어가고, 시스템은 데드락 탐지(또는 예방 규칙) 로 사이클을 끊는다.
- 작업 중 **락 업그레이드 (S→X 등)**나 에스컬레이션 (여러 행→테이블) 요청이 오면 다시 매트릭스 검사를 거친다.
- 트랜잭션 종료 시 해제→대기 큐 재평가로 다음 요청이 깨어난다.
미니 시나리오
- T1:
Orders일부 행 업데이트- 상위 노드에 IX, 타깃 행에 X 요청.
- T2:
Orders풀 스캔 읽기- 상위 노드에 IS, 각 범위/행에 S 요청.
- 판정: 테이블 수준 **IS(읽기 의도) ↔ IX(쓰기 의도)**는 호환 → 두 TX 는 겹치지 않는 범위에서는 동시에 진행. 실제 충돌은 같은 행/키 - 레인지에서만 발생.
핵심 원리 및 이론적 기반
락 호환성의 원칙과 철학
- 무엇: 호환성 매트릭스는 " 지금 누가 어떤 락을 잡았을 때, 다른 락을 줄 수 있는가?” 를 표로 정한 운영 규칙.
- 핵심 생각:
- 가능한 한 약한 락으로 동시성을 크게 하고 (최소 제한),
- 모든 판단은 표에 근거해 즉시·일관되게 하며 (명시적 규칙),
- 의도 락으로 상·하위 자원 간 약속을 먼저 하고 (계층적 일관성),
- 필요하면 키 - 범위 락으로 범위까지 보호해 팬텀을 막는다 (범위 무결성).
- 스케줄의 안전한 직렬가능성은 2PL/Strict 2PL 같은 프로토콜과 함께 달성한다 (프로토콜 일관성).
락 호환성 핵심 원칙 일람표
| 원칙 | 목적 | 왜 필요한가 (요지) | 근거 |
|---|---|---|---|
| 최소 제한 | 동시성 최대화 | 불필요한 직렬화 감소, 처리량/응답성 향상 | PostgreSQL: " 가장 덜 제한적인 모드 " 자동 선택 |
| 명시적 호환성 | 결정론적 판정 | 예측 가능·디버깅 용이·표준화 | SQL Server 문서/서적의 호환성 매트릭스 |
| 계층적 일관성 | 자원 계층 합치 | 의도 락으로 상·하위 계획 공유, 광역 충돌 축소 | MGL, InnoDB 의도 락 |
| 프로토콜 일관성 | 직렬가능성 보장 | 매트릭스 +2PL/Strict 2PL 결합 필요 | 2PL/Strict 2PL 문헌/논문 |
| 범위 무결성 | 팬텀 방지 | 범위 질의 일관성 확보 (Serializable 등) | 키 - 범위 락 호환성 표 |
핵심은 **" 약하게, 명시적으로, 계층적으로, 프로토콜과 함께, 필요 시 범위까지 “**다.
이 다섯 축이 조합되어 높은 동시성과 강한 무결성을 동시에 달성한다.
락 호환성 설계 철학 일람표
| 설계 철학 | 설명 | 목적 | 왜 필요한가 | 근거 |
|---|---|---|---|---|
| 충분히 허용·안전 방지 | 읽기=S, 쓰기=X 로 충돌만 차단 | 읽기 병렬화·쓰기 무결성 | OLTP 에서 동시성·일관성 균형 | S/X 개념 정리 문헌 |
| 명시적 규칙 기반 | 호환성 표를 단일 규칙으로 사용 | 예측 가능·자동화 | 제품/옵션 차이를 규칙 표로 캡슐화 | SQL Server 호환성 표 |
| 계층·신호 기반 | 의도 락으로 상·하위 계획 공유 | 대규모에서도 성능 유지 | 광역 충돌·탐색 비용 최소화 | MGL·InnoDB 의도 락 |
세 철학은 각각 병렬성, 예측 가능성, 확장성을 책임진다.
셋이 맞물릴 때 복잡한 워크로드에서도 일관된 성능·안정성이 나온다.
호환성 매트릭스로 여는 락 동작의 모든 것
- 무엇을 결정하나?
" 이 락과 저 락이 같이 있어도 되는가?” 를 호환성 매트릭스로 즉시 결정한다. 예) S↔S 허용, S↔X·X↔X 거부. - 충돌 나면?
대기 큐에서 순번 대기. 오래 멈춰 있으면 시스템이 데드락 탐지(또는 예방 규칙 적용) 로 한 트랜잭션을 중단해 막힌 고리를 푼다. - 계층 구조는?
테이블·페이지·행 같은 계층 자원에선 의도 락으로 " 하위에서 잠글 의도 " 를 상위에 알려 빠른 판정과 안전한 에스컬레이션을 가능하게 한다.
기본 동작 원리 및 메커니즘
- 락 요청·조회: T 가 R 에 모드 M 을 요청하면 락 관리자는 락 테이블(자원별 보유·대기 현황) 과 자원별 대기 큐를 조회한다.
- 호환성 판정: 매트릭스로 현재 보유 락들과의 전원 호환일 때만 부여. S↔S 는 허용, S↔X·X↔X 는 거부가 대표 규칙.
- 대기·스케줄링: 불허 시 대기 큐에 넣고, 해제 신호가 오면 재평가→부여. 구현별로 FIFO/우선순위/락 변환 대기 등 세부 정책이 다를 수 있다.
- MGL·의도 락: 계층 자원에서는 상위→하위 순서로 IS/IX/SIX를 먼저 확보해 충돌을 상위에서 빠르게 탐지하고, 필요 시 에스컬레이션을 안전하게 수행한다.
- 데드락 처리:
- 탐지 방식: 예를 들어 Postgres 는 일정 시간 대기 후 waits-for 그래프를 검사해 순환이 있으면 한 트랜잭션을 중단한다. SQL Server 는 Lock Monitor가 **주기 (기본 5 초)**로 탐지한다.
- 예방 방식: Wait-Die/Wound-Wait처럼 타임스탬프 우선순위 규칙을 적용하면 사이클을 사전에 차단할 수 있다.
- 팬텀 대응 (필요 시): 인덱스 범위를 동시 보호해야 하면 InnoDB 처럼 넥스트 - 키 락(레코드 + 앞 갭) 을 사용해 삽입 팬텀까지 막는다.
락 메커니즘 구성요소 한눈에 보기
| 구성요소 | 역할 | 핵심 판정/정책 | 구현 사례·근거 |
|---|---|---|---|
| 락 테이블/큐 | 자원별 보유/대기 상태 관리 | 자원별 대기 큐 유지, 해제 시 재평가 | PostgreSQL Explicit Locking 문서 흐름과 합치 |
| 호환성 매트릭스 | 허용/거부 즉시 판정 | S↔S 허용, S↔X·X↔X 거부 (기본) | 공식 문서의 충돌 표와 일치 |
| MGL·의도 락 (IS/IX/SIX) | 계층 자원에서 빠른 충돌 판정·에스컬레이션 안전화 | 상위→하위 순차 취득, SIX로 대량 읽기 + 부분 쓰기 최적화 | Gray 의 그레뉼러리티 논문 계열 |
| 데드락 탐지 | 교착 순환 발생 시 처리 | Postgres: 지연 후 탐지 / SQL Server: 주기 탐지 (≈5 초) | 설정·가이드 명시 |
| 데드락 예방 | 사이클 자체 회피 | Wait-Die / Wound-Wait(타임스탬프 우선순위) | CMU 15-445 강의 노트 |
| 락 에스컬레이션 | 미세 락→상위 락 전환으로 오버헤드 감소 | 조건/임계치 기반 (예: SQL Server) | MS 문서·사례 정리 다수 |
| 범위 잠금 | 팬텀 방지 | 넥스트 - 키/갭 락으로 인덱스 범위 보호 | InnoDB 공식 문서 |
- 판정의 핵은 언제나 호환성 매트릭스다. MGL 에선 의도 락으로 상위에서 빠른 판정이 가능해진다. 데드락은 탐지 또는 예방 규칙으로 해결한다. 팬텀을 다뤄야 할 때는 범위 잠금을 병행한다. ([PostgreSQL][1])
락 요청에서 해제까지의 전체 흐름
flowchart TD
%% 7.1 보완 반영: 데드락 탐지 타이머, 예방 규칙, 에스컬레이션/변환 경로 포함
A[트랜잭션 T가 자원 R에 모드 M 요청] --> B{자원 R에 보유 락 존재?}
B -- NO --> C[Grant: 락 부여]
B -- YES --> D[호환성 매트릭스 검사]
D -- 호환 --> C
D -- 비호환 --> E{정책 선택}
E -- 대기정책 --> F[자원별 대기 큐 등록]
E -- 예방정책 --> G{Wait-Die/Wound-Wait}
G -- 대기 허용 --> F
G -- 중단/선점 --> H[희생TX Abort·Rollback]
F --> I[대기]
I --> J{deadlock_timeout/주기적 탐지}
J -- 데드락 검출 --> H
J -- 미검출 --> I
C --> K[작업 수행]
K --> L{"락 변환 필요? (업그레이드/SIX 등)"}
L -- YES --> M[호환성 재검사·변환 시도]
L -- NO --> N[정상 진행]
M -- 성공 --> N
M -- 실패 --> F
N --> O{에스컬레이션 임계치 초과?}
O -- YES --> P[상위 락으로 에스컬레이션]
O -- NO --> Q[계속]
Q --> R[커밋/롤백 시 해제]
P --> R
R --> S[대기 큐 재평가·가능한 요청 부여]
- 핵심 분기점은 “호환성 매트릭스 검사” 와 “정책 선택 (대기 vs 예방 규칙)” 이다. Postgres 처럼 지연 후 데드락 탐지를 두거나 (SQL Server 는 주기적 Lock Monitor) 예방 규칙 (Wait-Die/Wound-Wait) 로 사이클을 사전 차단할 수 있다. 대량 미세 락이 누적되면 에스컬레이션으로 오버헤드를 줄인다.
호환성 매트릭스로 설계하는 락 처리
애플리케이션이 데이터를 만지려면 먼저 락을 " 요청 " 하고, 락 관리자는 현재 잡혀 있는 락과의 " 호환성 표 " 를 보고 허용할지 판단한다.
되면 바로 " 부여 “, 안 되면 " 대기 " 로 보낸다.
트랜잭션이 끝나면 락을 " 해제 " 하고, 기다리던 요청을 깨운다.
테이블–행 같은 계층 구조에서는 먼저 상위에 의도락을 걸고 하위에 실제 락을 건다.
직렬화 격리에서는 키 - 범위 규칙을 함께 적용한다.
락 데이터·제어 흐름 한눈에 보기
- 단계: 요청 → 의도락 선취 → 호환성 검사 → 부여/대기/거부 → 대기 관리 (데드락/타임아웃/에스컬레이션) → 해제·깨우기.
- 판단 축: 모드 (S/X/U), 그라뉼러리티, 격리수준 (특히 직렬화의 키 - 범위), 현재 점유 현황.
- 산출: 락 상태 변화 (Granted/Waiting/Aborted/Released) 와 시스템 메트릭 (대기시간, 타임아웃 수).
락 데이터·제어 흐름 단계별 정리
| 단계 | 입력/상태 | 핵심 로직 (의사결정) | 산출/다음 상태 | 관련 포인트 |
|---|---|---|---|---|
| 요청 | Txn ID, 객체, 모드, 격리수준 | 상위 노드 의도락 (IS/IX/SIX) 필요 여부 판단 | 의도락 요청 또는 락 테이블 조회 | 다중 그라뉼러리티 |
| 호환성 검사 | 현재 보유 락 목록 | 매트릭스·격리수준 적용해 Compatible/Conflict | 부여 또는 대기 큐 삽입 | 키 - 범위 (직렬화) |
| 결정 | Compatible | 락 부여, 소유자 목록 갱신 | Granted → 작업 실행 | 공유/배타 원칙 |
| 결정 | Conflict | 대기 큐 삽입, Wait-for 에지 추가 | Waiting | 데드락 가능성 |
| 관리 | Waiting | 데드락 탐지/타임아웃/에스컬레이션 | Aborted 또는 Granted | DMV/모니터링 |
| 해제 | 커밋/롤백 또는 2PL 수축 | 소유 락 해제, 대기자 깨우기 | Released → 다음 대기자 재평가 | 2PL 수축 |
호환성 기반 락 처리 플로우
flowchart TD
A[Txn 시작] --> B[자원 접근 필요]
B --> C["락 요청 생성<br/>(객체, 모드, 격리, 그라뉼러리티)"]
C --> D{의도락 필요?}
D -- 예 --> D1[상위 노드 IS/IX/SIX 선취]
D -- 아니오 --> E[락 테이블 조회]
D1 --> E
E --> F{매트릭스 호환?}
F -- 예 --> G[Grant: 소유자 목록 갱신]
G --> H[연산 수행]
H --> I{커밋/롤백 또는 2PL 수축?}
I -- 아니오 --> B
I -- 예 --> J[Release: 보유 락 해제]
J --> K["대기 큐 깨우기(FIFO/우선순위)"]
K --> E
F -- 아니오 --> L[대기 큐 삽입, Wait-for 에지 추가]
L --> M{데드락/타임아웃?}
M -- 데드락/만료 --> N[Victim abort 및 롤백]
N --> J
M -- 없음 --> L
요청 시 상위 노드 의도락을 통해 하위 잠금 의도를 알리고, 호환성 매트릭스가 즉시 부여 여부를 판정한다. 충돌 시 대기 큐에 넣고 Wait-for 그래프를 갱신해 데드락을 탐지한다. 커밋/롤백에서 락을 해제하고 대기자에게 기회를 준다. 직렬화 격리에서는 키 - 범위 규칙이 F 의 판정에 영향을 준다.
락 상태 전이와 운영 이벤트
stateDiagram-v2 [*] --> Requested: 락 요청 도착 Requested --> Granted: 호환성=예 Requested --> Waiting: 호환성=아니오 Waiting --> Aborted: 데드락 감지/타임아웃 Waiting --> Granted: 선행 락 해제 Granted --> Escalating: 임계치 초과(행→페이지/테이블) Escalating --> Granted: 에스컬레이션 성공 Granted --> Released: 커밋/롤백(2PL 수축) Released --> [*] Aborted --> [*]
기본 Requested–Granted–Waiting–Released 에 운영 이벤트 (에스컬레이션·타임아웃·데드락) 를 반영했다. 2PL 수축 단계에서 Released 로 전이되며, 에스컬레이션은 대기·경합 비용을 낮추려는 운영적 선택이다.
특성 분석 및 평가
LCM 으로 성능과 정합성을 동시에
- 무엇: LCM 은 “어떤 락끼리 동시에 가능한지” 를 미리 표로 정해 둔 규칙.
- 왜 유용: 요청 순간 허용/대기를 즉시 판정해 처리량↑·오류↓.
- 어떻게:
- 리소스가 계층이라 **의도락 (IS/IX/SIX)**로 상·하위 충돌을 빠르게 거르고,
- 범위 질의의 팬텀은 제품별 범위락(키 - 범위/넥스트키/프레디케이트) 으로 막는다.
- 2PL 과 결합해 무결성/격리를 체계적으로 달성한다.
LCM 장점·효과 한눈에 보기
| 장점 | 상세 설명 | 기술 근거 | 적용 상황 | 실무 효과 |
|---|---|---|---|---|
| 동시성 최적화 | 호환 조합은 즉시 승인, 불필요 대기 최소화 | SQL Server/PG 호환성 표 | 읽기 집약·혼합 워크로드 | QPS·동시 사용자↑ |
| 무결성/격리 | 2PL+LCM 으로 Dirty/Lost Update 차단 | 15-445 2PL 노트 | 금융/재고/결제 | 정합성·신뢰성 확보 |
| 예측 가능성 | 표 기반 규칙으로 성능/대기 예측 용이 | 락/버저닝 가이드 | 성능 점검·리뷰 | 디버깅·튜닝 시간↓ |
| 확장성 (MGL) | IS/IX/SIX·에스컬레이션으로 자원 제어 | InnoDB 의도락·MGL | 대규모 DML/배치 | 락 수·메모리 관리 |
| 팬텀 방지 | 범위 기반 잠금 (키 - 범위/넥스트키/SIREAD) | 각 제품 문서 | 직렬성 요구 범위 질의 | 논리 오류 제거 |
| 자동 충돌/데드락 | 엔진이 그랜트/대기/롤백 자동 판단 | SQL Server 가이드, 2PL | 고동시성 트랜잭션 | 운영 비용↓, 안정성↑ |
| 엔진 선택성 | 격리 준수 내 잠금 전략 최적화 | SQL Server 가이드 | 혼합 워크로드 | 성능 - 정합성 균형 최적화 |
LCM 은 표 기반 즉시 판정을 중심축으로, MGL/의도락·범위락·2PL을 결합해 처리량을 높이면서도 정합성을 지키는 구조다. 제품별 범위락의 차이는 있지만 목표는 동일하며, 엔진은 같은 격리수준 안에서도 전략을 상황에 맞게 선택한다.
락 호환성의 한계와 대응 전략
- 락 호환성 매트릭스는 충돌을 막는 강력한 규칙표지만, 경합·대기/데드락/오버헤드/복잡성을 동반한다.
- 직렬가능성을 원하면 보통 2PL/Strict 2PL을 함께 지켜야 하며, 이때 데드락이 생길 수 있다.
- 팬텀을 막으려면 키 - 범위/넥스트키 락처럼 범위를 보호하는 락이 필요하다.
- 실시간·대규모 분산 요구가 강하면, 우선순위 역전/중앙 병목 문제를 고려해 분산 락·락프리·MVCC 등과 병행 설계한다.
락 호환성의 본질적 단점 일람표
| 단점 | 설명 | 원인 | 실무 문제 | 완화/해결 방안 | 대안 기술 |
|---|---|---|---|---|---|
| 경합·대기 | 충돌 시 대기·타임아웃 증가 | 비호환 락 경쟁 | TPS 저하·장애성 타임아웃 | 인덱스/쿼리 재설계, 파티셔닝, 스냅샷 읽기 병행 | MVCC, 낙관적 동시성 |
| 데드락 | 상호 대기로 진행 정지 | 2PL 락 순서 불일치 | 롤백·장애 알림 | 락 순서 표준화, 짧은 트랜잭션, 탐지/타임아웃 | 낙관적/타임스탬프 기법 |
| 복잡성 증가 | 모드·계층·규칙 증가 | 다중 모드/계층 설계 | 설계·테스트 난이도↑ | 표준 모드 사용, 문서화·교육 | 단순화된 버저닝 활용 |
| 오버헤드 | 락/대기열/탐지 비용 | 락 관리·모니터링 | 메모리/CPU 부담 | 락 수 절감, 파라미터 튜닝, 모니터링 (pg_locks) | RCU/락프리, MVCC |
| 에스컬레이션 부작용 | 광범위 잠금으로 동시성↓ | 임계치·메모리 보호 정책 | 대규모 블로킹 | 임계치 조정, 파티셔닝·슬라이싱 | 파인 그래뉼러리티 유지 |
| 굶주림/우선순위 역전 | 특정 트랜잭션 지속 밀림 | 락 큐·우선순위 충돌 | 응답시간 편차·SLO 위반 | 우선순위 상속/큐 정책 | RT 친화 락프리/RCU |
핵심 리스크는 경합·교착·오버헤드·복잡성이며, 에스컬레이션과 우선순위 역전이 상황을 악화시킨다. 완화는 쿼리/인덱스 재설계·파티셔닝·정책 튜닝·모니터링과 버저닝·낙관적 기법 병행이 효과적이다.
락 호환성의 구조적 제약 일람표
| 제약사항 | 설명 | 원인 | 영향 | 해결 방안 | 대안 기술 |
|---|---|---|---|---|---|
| 2PL 의존성 | 직렬가능성 위해 2PL/Strict 2PL 필요 | 규칙표만으로 스케줄 보장 한계 | 설계 제약·지연·교착 | 2PL 준수·락 순서·짧은 트랜잭션 | SI/MVCC·타임스탬프 |
| 범위 무결성 | 팬텀 방지엔 범위 락 필요 | 삽입/삭제로 읽기집합 변동 | Serializable 미달 | 키 - 범위/넥스트키 적용·인덱스 | SSI 등 고급 격리 |
| 중앙 병목 | 단일 락 관리자 병목·SPOF | 모든 요청 집결 | 확장성·가용성 저하 | 분산 락 매니저·샤딩 | ZooKeeper/etcd/Chubby 연계 |
| 실시간 부적합 | 대기·역전으로 지연 비결정 | 락 기반 블로킹 | 데드라인 위반 | 우선순위 상속/ceiling | 락프리/RCU·RT DB 기법 |
| 제품별 차이 | 모드/호환성/정책 상이 | 벤더 설계 차이 | 이식성·예측 난이도↑ | 벤더 문서 준수·추상화 | CQRS/폴리글랏 저장소 |
직렬가능성 (2PL), 범위 일관성, 중앙 병목, RT 요구, 제품별 차이가 구조적 제약이다. 해결은 프로토콜 준수·범위락·분산화·RT 기법·추상화 조합으로 접근한다.
락 트레이드오프의 전략적 설계
- 작게 잠그면 많이 동시에 일함 (동시성↑) 대신 관리비와 데드락 위험이 늘 수 있다. 크게 잠그면 반대로 단순·저비용이지만 서로 기다리게 된다. 이 기본 축에서 모드 강도(S/IS ↔ X/SIX), 범위 보장, 데드락 정책, 에스컬레이션을 조합해 워크로드에 맞춘다.
락 선택의 양면성과 의사결정 기준
| 축 | 선택 A | 장점 (A) | 단점 (A) | 선택 B | 장점 (B) | 단점 (B) | 트레이드오프/기준 |
|---|---|---|---|---|---|---|---|
| 락 단위 | 행/키 수준 | 동시성↑, 충돌 국소화 | 락 수↑, 메모리/관리비↑, 데드락 위험↑ | 테이블 수준 | 관리 단순, 오버헤드↓ | 동시성↓, 대기 증가 | 트래픽 패턴·메모리 여유·핫스팟 분포. |
| 락 모드 | S/IS | 읽기 병행↑ | 쓰기와 충돌, 갱신 지연 | X/SIX | 갱신 안전·일관성↑ | 동시성↓, 차단↑ | 읽기: 쓰기 비율·서비스 SLO. |
| 범위 보장 | 없음/최소 | 읽기 성능↑, 차단↓ | 팬텀 가능 | 키 - 레인지 (넥스트 - 키) | 팬텀 차단, 직렬화 용이 | 스캔 차단·성능↓ | 팬텀 민감도·인덱스 설계. |
| 데드락 | 탐지 위주 | 동시성 유지, 유연 | 탐지 오버헤드, 롤백 발생 | 예방 (Wait-Die/Wound-Wait) | 데드락 원천 차단 | 보수적 중단·기아 위험 관리 필요 | 충돌 빈도·응답시간 목표. |
| 에스컬레이션 | 사용 | 락 수↓, 메모리 안정 | 동시성 급감 가능 | 비활성/보수적 | 동시성 유지 | 메모리/메타락 부담 | 테이블 크기·락 임계·엔진 정책. |
- 작게 + 약하게 + 범위 최소는 처리량 최적화에 유리하지만, 데드락/관리비가 댓가다.
- 크게 + 강하게 + 범위 보장은 일관성을 단단히 지키지만, 대기·차단이 늘어난다.
- 운영에서는 에스컬레이션/예방 정책을 섞어 동시성–안정성의 균형점을 찾는다.
락 하이브리드 패턴과 적용 포인트
| 하이브리드 | 구성 요소 | 적용 목적 (해결 트레이드오프) | 장점 | 고려사항 |
|---|---|---|---|---|
| MGL + 적응형 에스컬레이션 | 행/페이지 락 + 임계 도달 시 테이블 락 승격 | 동시성 vs 관리비 | 평시 동시성↑, 피크 시 메모리 안정 | 승격 순간 차단폭↑·임계치 튜닝 필수. |
| 버전화 읽기 + 필요 시 범위락 | 행 버전화 (ROW VERSIONING) + 직렬화 구간에만 레인지/테이블 LOCK | 읽기 성능 vs 팬텀 방지 | 읽기 비차단·핵심 구간만 강보호 | 격리수준 혼용 시 일관성 규칙 명확화. |
| 예방 (Wait-Die/Wound-Wait) + 탐지 보조 | 타임스탬프 우선순위 + 주기적 waits-for 탐지/타임아웃 | 데드락 제로 vs 불필요 중단 | 사이클 감소·잔여 케이스 신속 해소 | 재시도 폭주/기아 방지 정책 필요. |
| 인덱스 설계 + 넥스트 - 키 최소화 | 선택도 높은 인덱스·조건 최적화로 스캔 폭 축소 | 범위락 비용 vs 팬텀 방지 | 잠금 범위·시간 단축 | 설계 품질에 민감, 실행계획 관찰 필요. |
- 하이브리드는 매트릭스의 원리는 그대로 두고 정책 조합으로 균형을 맞춘다.
- 에스컬레이션·버전화·예방/탐지의 조합은 워크로드·SLO·자원 한계에 맞춰 조율한다.
업무 특성으로 판단하는 락 적용성
데이터 정합성이 매우 중요한 시스템은 락 호환성 표를 기준으로 어떤 조합을 동시에 허용할지 설계하면 안전하다. 반대로 초저지연이나 폭주 쓰기처럼 잠금 대기가 치명적인 경우에는 MVCC 스냅샷이나 낙관적 검증 (OCC) 등 잠금을 최소화하는 방법이 더 맞다. 필요에 따라 읽기는 버전닝, 범위 보장은 키 - 범위 락으로 결합한다. ([PostgreSQL][3])
락 호환성 매트릭스 적용 판단 프레임
설계 관점
- 높은 적합: 트랜잭션 간 쓰기 충돌이 현실적으로 빈번하고, 정합성 위반 비용이 큰 도메인 (금융/의료/ERP). 키 - 범위·의도락·그라뉼러리티로 스키마/인덱스·쿼리 패턴을 함께 설계. ([Microsoft Learn][2])
- 낮은 적합: 엄격한 마이크로초~밀리초 SLA(HFT)·폭주 쓰기 (IoT). OCC·배치 병합·로그 구조/파티션으로 충돌을 시간/공간 분리. ([eecs.harvard.edu][5])
분석 관점
- 읽기 지배 워크로드는 버전닝 기반 스냅샷 (Non-locking read) 로 대기를 줄이고, 필요한 지점만 잠금 강도를 올린다. ([PostgreSQL][3])
- 직렬화 필요한 범위 연산은 키 - 범위 락으로 팬텀 억제. 비용–효과를 트랜잭션 빈도·카디널리티로 산정. ([Microsoft Learn][2])
운영 관점
- 경합 증가 시: 락 대기/타임아웃 모니터링 (Perf counters/DMV) → 쿼리/인덱스/락 모드/그라뉼러리티 재조정 → 필요 시 에스컬레이션/버전닝 전환 (RCSI/SI) 검토. ([Microsoft Learn][7])
워크로드별 락 매트릭스 적용 판단
| 시나리오 | 적합성 | 주요 이유 | 권장 전략 |
|---|---|---|---|
| 금융/의료 트랜잭션 | 높음 | 강한 일관성·감사 추적 필요 | 의도락 + 키 - 범위, 직렬화 필요한 경로만 강화 |
| ERP/OLTP(혼합 R/W) | 높음 | 쓰기 충돌·업데이트 경합 | 그라뉼러리티·락 모드 튜닝, 인덱스/쿼리 동시 설계 |
| 조회 위주 분석 | 중간 | 읽기 다수·쓰기 적음 | MVCC 스냅샷 기본, 필요한 부분만 잠금 |
| 초저지연 거래 (HFT) | 낮음 | 락 대기 자체가 SLA 위반 | OCC·락프리·분할정복 (파티션) |
| IoT 대용량 쓰기 | 낮음 | 삽입 폭주·락 경합 | 파티셔닝·비동기 적재·OCC/배치 병합 |
| 캐시·최종 일관성 허용 | 낮음 | 일시적 불일치 허용 | OCC/버전닝·TTL·리트라이/멱등 설계 |
강한 일관성이 가치인 곳은 락 호환성 중심, 초저지연·폭주 쓰기는 버전닝·낙관적 검증·파티셔닝으로 잠금 의존도를 낮추는 쪽이 유리하다.
구현 방법 및 분류
목표지향 LCM 구현 전략 로드맵
호환성 판정은 크게 **” 표로 즉시 보기 (매트릭스/비트)"**와 " 규칙으로 계산 (부분순서/함수)" 두 부류다.
표·비트는 빠르고 단순하며, 모드가 변하지 않는 일반 RDBMS 에 적합하다.
규칙·함수는 새 모드/새 리소스가 늘어나는 시스템에서 확장성이 강하다.
어떤 방식을 택하든 실무에선 의도락 (IS/IX/SIX), U(Update), 키 - 범위/넥스트키 같은 벤더 확장 모드/범위 잠금도 함께 반영해야 실제 쿼리 현상을 정확히 판정할 수 있다.
근거는 각 DBMS 의 공식 문서 (락 모드·호환 표, U/키 - 범위/넥스트키 설명) 에서 확인된다.
LCM 구현 4 대 방식
매트릭스 테이블 방식
- 정의: 모드×모드 2 차원 배열 (또는 해시) 에 호환/충돌 비트 저장.
- 특징: O(1) 룩업, 단순·안정적. 모드가 고정일 때 유리.
- 목적: 런타임 판정 지연 최소화.
- 사용: 범용 RDBMS(테이블·행/키 레벨 모두).
- 예시 (Python):
- 근거: DB 문서가 락 모드 호환성 표를 제공 (실제 엔진은 이 표를 빠르게 조회).
비트마스크 방식
- 정의: 각 모드에 " 호환 가능한 상대 모드 집합 " 을 비트셋으로 부여,
mask[req] & (1<<hold)로 판정. - 특징: 메모리 초절약·분기 최소, CPU 친화.
- 목적: 고동시성/임베디드·인메모리에서 분기비용 절감.
- 사용: 고성능 엔진·캐시형 락매니저.
- 예시 (Python):
- 근거: 상용/오픈소스 엔진이 내부적으로 비트/배열 기반으로 충돌 검사 최적화. PG 는 fast-path까지 두어 빠른 충돌 체크 경로를 둔다.
계층적 규칙 (부분순서) 방식
- 정의: 락 강도 (partial order) 를 정의하고 의도락 (IS/IX/SIX) 규칙과 부모→자식 전파로 호환성을 계산.
- 특징: 동적 확장(새 모드 추가 용이), 다중 그레뉼러리티에 직관적.
- 목적: 사용자 정의 모드·새 리소스 타입 추가 시 재컴파일 최소화.
- 사용: 복잡한 계층/분산 잠금·플러그블 스토리지.
- 예시 (의사코드):
- 근거: Multiple Granularity/의도락 이론 (Gray & Reuter).
함수형 매핑 방식
- 정의:
(mode1, mode2) -> bool을 순수 함수/패턴매칭으로 캡슐화. - 특징: 테스트 용이, 규칙 변경이 컴파일 타임에 드러남.
- 목적: 코드 가독성·검증성 중시 환경.
- 사용: 함수형 언어·정적 분석/프로퍼티 기반 테스트 병행.
- 예시 (JavaScript)
- 근거: U(Update), 키 - 범위 등 벤더 확장을 명시적 패턴으로 표현하기 적합 (SSMS 가이드의 모드 정의 근거).
실무 확장 (판정 대상에 반영)
- 의도락 (IS/IX/SIX): 상위 보호 신호로 계층 호환성 계산에 필수.
- U(Update): S 와 호환, U 끼리는 비호환 → 교착 감소를 위한 단계적 승격 (U→X).
- 키 - 범위/넥스트키: SERIALIZABLE에서 팬텀 방지 (인덱스 범위 자체를 자원으로 보고 호환성 평가).
LCM 구현 4 대 방식 요약표
| 방식 | 정의 | 특징 | 목적 | 사용 상황 | 간단 예시 | 근거 |
|---|---|---|---|---|---|---|
| 매트릭스 | 모드×모드 2 차원 표 | O(1) 룩업, 단순 | 런타임 최소화 | 모드 고정형 RDBMS | compat[req][hold] | PG/SS 표 기반 판정 |
| 비트마스크 | 모드별 호환 집합 비트셋 | 메모리/분기 최소 | 고성능/임베디드 | 인메모리·캐시형 | mask[req]>>hold &1 | PG fast-path 설계 |
| 부분순서 | 강도·의도 규칙 계산 | 동적 확장 용이 | 새 모드 대응 | 플러그블 스토리지 | conflicts(strength) | 의도락 이론 |
| 함수형 | (m1,m2)→bool 함수 | 테스트 친화 | 가독성/검증성 | 함수형/정적분석 | 패턴매칭 스위치 | 모드 정의 근거 |
목표별 LCM 구현 분류
성능 최우선
- 내용: 고정 모드 집합에서 캐시 친화 O(1) 판정. 비트마스크는 분기 최소·메모리 절약, 매트릭스는 디버깅 용이. 키 - 범위/넥스트키 등 범위 자원도 자원 ID만 정규화하면 동일 프레임으로 판정 가능.
| 기법 | 장점 | 주의점 | 적용 팁 |
|---|---|---|---|
| 매트릭스 | 단순/O(1) | 모드 추가 시 재배포 | 표 생성 코드 자동화 |
| 비트마스크 | 극저비용 | 가독성↓ | 생성 스크립트·테스트 벡터 병행 |
- 요약: 지연 최소·예측 가능성이 필요하면 A.
확장성/표현력
- 내용: 의도락·U·키 - 범위 같은 확장을 규칙으로 캡슐화. 모드 추가/리소스 타입 추가가 쉬움.
| 기법 | 장점 | 주의점 | 적용 팁 |
|---|---|---|---|
| 부분순서 | 새 모드/자원에 유연 | 런타임 비용↑ | 규칙→캐시된 결정표로 컴파일 |
- 요약: 변화 많은 엔진/플러그블 스토리지면 B.
검증/가독성
- 내용: 순수 함수/패턴매칭으로 테스트와 코드 리뷰가 쉽다. 정적분석·속성기반 테스트로 호환성 불변식을 검증.
| 기법 | 장점 | 주의점 | 적용 팁 |
|---|---|---|---|
| 함수형 | 테스트 용이 | 속도 최적화 필요 | 생성 시 테이블로 다운컴파일 |
- 요약: 정확성·테스트 우선이면 C.
LCM 구현 선택 매트릭스
| 카테고리 | 기법 | 성능 | 확장성 | 가독/검증 | 주 용도 | 근거 |
|---|---|---|---|---|---|---|
| 성능 최우선 | 매트릭스 | ★★★★★ | ★★☆ | ★★★★ | 범용 RDBMS | PG/SS 호환 표 |
| 성능 최우선 | 비트마스크 | ★★★★★ | ★★☆ | ★★★ | 인메모리/임베디드 | PG fast-path 힌트 |
| 확장성/표현력 | 부분순서 | ★★★ | ★★★★★ | ★★★ | 플러그블 스토리지 | 의도락 이론 |
| 검증/가독성 | 함수형 | ★★★ | ★★★★ | ★★★★★ | 테스트·도메인 주도 | 모드 정의 명시 |
LCM 락 유형
- 락은 무엇을 하려는가 (읽기/쓰기/업데이트), 어디를 보호하나 (테이블~키범위), **팬텀을 어떻게 막나 (범위/논리)**로 나눠 보면 빠르게 이해된다.
- 이 세 축이 만나 호환성 표가 되고, 엔진은 이 표로 허용/대기를 즉시 결정한다. PostgreSQL·MySQL·SQL Server 문서 모두 이 흐름을 전제로 한다.
LCM 락 유형 분류 표준안
| 분류 축 | 유형 | 정의/핵심 | 대표 모드·예시 | 근거 |
|---|---|---|---|---|
| 의미/목적 (Access semantics) | 공유/배타 | 읽기 공유 (S), 쓰기 배타 (X) | FOR SHARE/FOR UPDATE | PG Explicit Locking, MySQL Locking Reads |
| 업데이트 (제품별) | S→X 전환 교착 완화 (U) | SQL Server U | SQL Server Locking Guide | |
| 그라뉼러리티/의도 (MGL) | 의도 락 | 하위 잠금 의도 신호 (IS/IX/SIX) | InnoDB IS/IX, MGL 규칙 | InnoDB Locking, CMU 노트 |
| 범위/논리 (Phantom control) | 범위 락 (물리) | 인덱스 키/갭 구간 보호 | SQL Server Key-Range, InnoDB Next-Key | MS Guide, MySQL Next-Key |
| 프레디케이트 (논리) | 조건 (프레디케이트) 기반 보호 | PostgreSQL SIREAD | PG Isolation(Serializable) | |
| 리소스 레벨 (Resource) | 테이블/페이지/행/키범위 | 보호 단위의 층위 | LOCK TABLE / 인덱스 레코드/갭 | PG LOCK, MySQL InnoDB 설명 |
| 관리 특성 (운용) | 에스컬레이션/자동 판정 | 미세락→상위 승격/그랜트·대기 | 엔진 자동화 | MGL·제품 가이드 종합 |
LCM 실무형 분류 기준 4 축
의미/목적 축
- 핵심: S(공유) 로 읽기 병행, X(배타) 로 쓰기 고립. 제품에 따라 **U(업데이트)**로 S→X 전환 시 교착 저감.
- 주요 차이: 단순 S/X 모델은 이해 쉬우나, 갱신 경합이 잦은 시스템은 U 도입이 유리 (특히 SQL Server).
| 모드 | 의도/효과 | 호환 포인트 | 대표 명령 |
|---|---|---|---|
| S | 읽기 공유 | S↔S 가능, S↔X 불가 | FOR SHARE(PG/MySQL) |
| X | 쓰기 독점 | X↔* 대부분 불가 | FOR UPDATE(PG/MySQL) |
| U(제품별) | S→X 전환 교착 완화 | U 는 S 와 제한 호환 | SQL Server U |
요약: 읽기·쓰기의 의미적 목적이 LCM 의 1 차 축이다. U 는 갱신 경합에서 교착 위험을 줄이는 제품 특수 완충 모드다.
그라뉼러리티/의도 축
- 핵심: IS/IX/SIX 는 “하위에 락을 둘 의도” 를 상위 노드에 표시해 충돌 판정 비용을 상수화.
- 운용: 다량의 행락은 에스컬레이션으로 상위로 승격해 메모리·메타데이터 사용을 제어.
| 모드 | 의미 | 호환 핵심 | 사용 맥락 |
|---|---|---|---|
| IS | 하위에 S 예정 | X 와 충돌 | 대량 읽기 트리 탐색 |
| IX | 하위에 X 예정 | S/X 와 폭넓게 충돌 | 대량 갱신 트리 탐색 |
| SIX | 상위 S + 하위 X 예정 | IX/IS 일부 호환 | 혼합 워크로드 |
요약: 의도 락은 계층 구조에서 충돌 사전 필터로 작동해 대규모 동시성에서 성능·안정성을 동시에 보장한다.
범위/논리 (팬텀 방지) 축
- 핵심: " 행만 " 잠그면 삽입/삭제로 생기는 팬텀을 못 막을 수 있어, 범위/논리로 막는다.
- 제품 차이: SQL Server=Key-Range, MySQL=Next-Key(레코드 + 갭), PostgreSQL=Predicate(SIREAD)(차단·데드락 유발 없음).
| 유형 | 보호 단위 | 특성 | 대표 |
|---|---|---|---|
| Key-Range | 인덱스 키 구간 | 겹치는 범위끼리 호환 표로 판정 | SQL Server ([Microsoft Learn][3]) |
| Next-Key | 레코드 + 앞 갭 | 스캔된 인덱스 범위를 넓게 보호 | MySQL InnoDB ([MySQL 개발자 존][5]) |
| Predicate | 논리 조건 | 차단·데드락 미유발, 직렬성 검증용 | PostgreSQL SIREAD ([PostgreSQL][6]) |
요약: 구현은 달라도 목표는 직렬성·팬텀 제거다. 워크로드·인덱스에 따라 잠금 면적이 달라져 성능이 변한다.
리소스 레벨 축
- 핵심: 테이블/페이지/행/인덱스 키 범위 등 보호 단위가 다르면 호환성과 비용이 달라진다.
- 운용 포인트:
LOCK TABLE모드 선택 오류는 DDL/DML 교착을 낳을 수 있어 충돌 표 확인이 필수.
| 레벨 | 장점 | 유의점 | 예시 |
|---|---|---|---|
| 테이블 | 관리 용이 | 동시성 저하 | LOCK TABLE … MODE(PG) |
| 행/키 | 동시성↑ | 잠금 수↑ | FOR UPDATE/SHARE |
| 키 범위 | 팬텀 방지 | 잠금 면적↑ | Next-Key/Key-Range ([MySQL 개발자 존][5]) |
요약: 레벨 선택은 성능·정합성의 트레이드오프. 설계·튜닝 시 인덱스/스캔 패턴과 함께 본다.
LCM 락 유형 통합 매트릭스
| 축 | 유형 | 핵심 설명 | 대표 모드/예시 | 실무 포인트 |
|---|---|---|---|---|
| 의미/목적 | 공유/배타/업데이트 | 읽기 공유 (S), 쓰기 배타 (X), 갱신 교착 완충 (U) | FOR SHARE/FOR UPDATE/U | 읽기/쓰기 경합 모델링 |
| 그라뉼러리티/의도 | IS/IX/SIX | 하위 잠금 의도 신호로 상수 시간 판정 | InnoDB IS/IX, MGL | 대규모 동시성·에스컬레이션 |
| 범위/논리 | Key-Range/Next-Key/Predicate | 팬텀 방지 (물리/논리) | SQLS Key-Range / MySQL Next-Key / PG SIREAD | 직렬성·정합성 보장 |
| 리소스 레벨 | 테이블/페이지/행/키범위 | 보호 단위 계층 | LOCK TABLE, 행/키·범위락 | 성능↔정합성 균형 |
락 생태계 전개도: 엔진·ORM·운영·분산
- 어디서 잠그고 어떻게 보나?
DB 엔진은 호환성 매트릭스를 근거로 잠금을 부여하며, Postgres 는pg_locks/pg_stat_activity, MySQL 은 갭/넥스트키+Performance Schema, SQL Server 는 DMV+Extended Events로 현황과 원인을 관측한다. - 애플리케이션에서는?
Hibernate/Spring/EF Core/SQLAlchemy/Django 가 락 힌트와 격리수준을 노출해, **" 언제 어떤 락을 요구할지 “**를 코드에서 선언한다. - 대규모/분산 환경은?
ZooKeeper/etcd/Redisson 같은 분산 락으로 서비스 간 상호배타를 보완한다.
락 생태계: 관측·제어·ORM·분산 총정리
RDBMS 내장 (관측·제어)
- PostgreSQL
- 기능/용도:
pg_locks로 보유/대기 락 조회,pg_stat_activity교차로 대기 원인 추적. - 강점: SQL 만으로 즉시 진단 · 표준화된 뷰 제공.
- 약점: 대용량 환경에선 결과 해석/상관관계 파악이 번거로움.
- 기능/용도:
- MySQL/InnoDB
- 기능/용도: 갭/넥스트키로 팬텀 방지; Performance Schema
data_locks/data_lock_waits로 락 가시화. - 강점: 범위 기반 충돌 통제 명확.
- 약점: 인덱스 스캔 범위가 넓을 경우 과잉 락 가능.
- 기능/용도: 갭/넥스트키로 팬텀 방지; Performance Schema
- SQL Server
- 기능/용도: 락 에스컬레이션 제어, 스냅샷 격리 (행 버전), DMV
sys.dm_tran_locks/Extended Events로 락/블로킹 분석. - 강점: XE 기반의 세밀 추적과 행버전 격리 옵션.
- 약점: Profiler 는 비권장(XE 로 대체).
- 기능/용도: 락 에스컬레이션 제어, 스냅샷 격리 (행 버전), DMV
- Oracle
- 기능/용도: MVCC 기반 읽기 일관성 + 락 조합으로 동시성/일관성 조화.
- 강점: 강력한 읽기 일관성과 성숙한 문서.
- 약점: 기능 스펙트럼이 넓어 학습 곡선이 가파름.
애플리케이션/ORM 계층
- Hibernate/JPA (@Lock, LockMode, 낙관/비관)
- 역할/용도: 엔티티/쿼리 수준에서 락 힌트 전파, 버전 필드로 낙관적 검증.
- 강점: 데이터 접근 계층에서 정책 일관화.
- 약점: DB 별 락 의미 차이 반영 필요.
- Spring
@Transactional- 역할/용도: 격리수준/전파/타임아웃/읽기전용 등 트랜잭션 속성 지정.
- 강점: 서비스 계층에서 선언적 일관성.
- 약점: 실제 락 의미는 DB 엔진에 좌우됨.
- EF Core
- 역할/용도: 낙관적 동시성 기본 제공 (버전/컨커런시 토큰).
- 강점: 충돌시 예외로 탐지·재시도 로직 구성 용이.
- 약점: 비관 잠금은 공급자/원격 DB 기능 의존.
- SQLAlchemy / Django
- 역할/용도:
with_for_update()/select_for_update()로 행 잠금. - 강점: SQL 힌트를 직접 노출해 제어력 높음.
- 약점: 조인/지연로딩 상황에서 잠금 범위 예측 주의.
- 역할/용도:
운영·모니터링 도구
- Extended Events(XE) / DMV(SQL Server)
- 역할/용도: 락/대기/데드락 이벤트 수집·분석,
sys.dm_tran_locks로 현재 상태 파악. - 강점: 저오버헤드·세밀 필터링, Profiler 공식 대체.
- 약점: 학습 난이도.
- 역할/용도: 락/대기/데드락 이벤트 수집·분석,
- sp_WhoIsActive(스크립트)
- 역할/용도: 리드 블로커·블로킹 체인 빠른 파악.
- 강점: 실전 대응 속도.
- 약점: 설치·권한 필요, 히스토리 수집은 별도 구성.
- PostgreSQL 생태 (예: pganalyze, 커뮤니티 스크립트)
- 역할/용도: 락 트리/대기 분석,
pg_locks+pg_stat_activity상관. - 강점: 시각화·경보.
- 약점: 상용 구독/에이전트·권한 필요 가능.
- 역할/용도: 락 트리/대기 분석,
분산 락/조정 (보완 레이어)
- ZooKeeper/Curator
- 역할/용도: 분산 락 레시피(클라이언트 협약 기반) 제공.
- 강점: 고가용 분산 조정 표준.
- 약점: 모델 복잡성·운영 부담.
- etcd concurrency
- 역할/용도: gRPC/Go 클라이언트로 분산 뮤텍스/선거 제공.
- 강점: 간결한 API, 리스 만료로 자동 해제.
- 약점: 올바른 리스·세션 관리 필요.
- Redis/Redisson(RLock 등)
- 역할/용도: 재진입/공정 락 등 다양한 분산 락 제공.
- 강점: 적용·코드 통합 용이.
- 약점: 네트워크 파티션·시계 드리프트 등 설계 주의 (알고리즘 선택).
락 도구 분류: 관측·제어·운영·분산
관측 (Observability)
- 내용: Postgres
pg_locks/pg_stat_activity, MySQL Performance Schema(data_locks,data_lock_waits), SQL Serversys.dm_tran_locks+Extended Events. - 역할/용도: " 누가·무엇을·얼마나 오래 " 잠갔는지, 블로킹 체인과 데드락 원인 파악.
- 강점: 엔진 일차 정보, 실시간/저오버헤드 (XE). Profiler 는 비권장.
| 도구 | 핵심 기능 | 강점 | 약점 |
|---|---|---|---|
pg_locks/pg_stat_activity | 현재 락/세션 상태 조회 | 바로 SQL 로 진단 | 상관분석 쿼리 필요 |
| Performance Schema | 데이터락/대기 추적 | 세밀 지표 | 설정·학습 필요 |
| SQL Server DMV+XE | 잠금/대기·데드락 이벤트 | 저오버헤드, Profiler 대체 | XE 학습 곡선 |
- 요약: 일단 엔진 내장 뷰/이벤트로 현황을 수치화하고, 필요 시 대시보드/경보를 더한다.
제어 (Control)
- 내용: Hibernate @Lock/LockMode, Spring
@Transactional격리, EF Core 낙관적 동시성, SQLAlchemywith_for_update, Djangoselect_for_update. - 역할/용도: 행/테이블 수준 잠금 힌트와 트랜잭션 속성으로 충돌을 설계.
- 강점: 도메인 코드에서 정책의 일관성 확보.
- 약점: DB 별 의미 차이 반영·테스트 필수.
| 프레임워크 | 정확한 기능 (예) | 강점 | 약점 |
|---|---|---|---|
| Hibernate/JPA | @Lock, LockMode, 버전필드 | 선언적/낙관·비관 병행 | DB 차이 반영 필요 |
| Spring | @Transactional(isolation=…) | 서비스계 일관성 | 엔진 의존 |
| EF Core | 낙관적 컨커런시 토큰 | 충돌 감지·재시도 용이 | 비관잠금 제약 |
| SQLAlchemy | .with_for_update() | SQL 직관성 | 조인시 범위 주의 |
| Django | .select_for_update() | 행 잠금 간편 | 트랜잭션 관리 필요 |
- 요약: 코드에서 락/격리를 명시하고, DB 별 테스트로 의미 일치 확인.
운영 (Operations)
- 내용: Extended Events 세션·차단 보고, sp_WhoIsActive(리드 블로커), Postgres 전용 SaaS/스크립트 (pganalyze 등).
- 역할/용도: 블로킹/데드락 패턴 탐지·알림·원인 분석, 에스컬레이션 점검.
- 강점: 실전 대응 시간 단축.
- 약점: 툴 학습/라이선스·권한 고려.
| 도구 | 기능 | 강점 | 약점 |
|---|---|---|---|
| Extended Events | 락/대기/데드락 수집·분석 | 저오버헤드·정밀 | 설정 난이도 |
| sp_WhoIsActive | 블로킹 체인 실시간 파악 | 즉시 대응 | 설치 필요 |
| pganalyze 등 | 락 트리 시각화·알림 | 편의성·대시보드 | 비용/에이전트 |
- 요약: XE/DMV 또는 전용 도구로 원인→영향을 연결해 본질 문제를 고친다.
분산 (Distributed Coordination)
- 내용: ZooKeeper/Curator 레시피, etcd concurrency API, Redisson RLock.
- 역할/용도: DB 외부에서 서비스 간 상호배타·리더선출.
- 강점: 마이크로서비스/잡 스케줄링 등에서 충돌 완화.
- 약점: 멱등성/네트워크 분할/타임아웃 설계가 필수.
| 도구 | 기능 | 강점 | 약점 |
|---|---|---|---|
| ZooKeeper/Curator | 분산 락 레시피 | 표준성·성숙 | 운영 복잡 |
| etcd concurrency | 분산 Mutex/선거 | 간명한 API | 리스 관리 필요 |
| Redisson | RLock/공정락 등 | 통합 쉬움 | 클러스터 고려 |
- 요약: DB 락 + 분산 락을 병행하여 데이터 내부/외부 경합을 모두 설계한다.
락 도구·프레임워크 통합 일람표
| 카테고리 | 대표 도구/프레임워크 | 정확한 기능/용도 | 강점 | 약점 |
|---|---|---|---|---|
| 관측 | Postgres pg_locks/pg_stat_activity | 보유/대기 락·세션 상태 교차 분석 | 내장·즉시성 | 상관 쿼리 필요 |
| MySQL Performance Schema | data_locks/data_lock_waits 로 충돌 가시화 | 세밀 지표 | 학습/설정 | |
| SQL Server DMV+XE | 잠금/대기/데드락 이벤트 | 저오버헤드 | 설정 난이도 | |
| 제어 | Hibernate/JPA | @Lock/LockMode/낙관·비관 | 선언적 제어 | DB 차이 |
| Spring | @Transactional 격리·전파 | 서비스계 일관성 | 엔진 의존 | |
| EF Core | 낙관적 컨커런시 | 충돌 처리 용이 | 비관잠금 제약 | |
| SQLAlchemy/Django | with_for_update/select_for_update | SQL 직관성 | 범위 주의 | |
| 운영 | Extended Events | 차단/데드락 수집·분석 (Profiler 대체) | 공식 대체 | 학습 곡선 |
| sp_WhoIsActive | 블로킹 체인 파악 | 신속 대응 | 배포 필요 | |
| 분산 | ZooKeeper/Curator | 분산 락/선거 레시피 | 성숙 | 운영 복잡 |
| etcd concurrency | 분산 Mutex/선거 | 간결 | 리스 관리 | |
| Redisson | RLock/공정락 등 | 통합 용이 | 네트워크 변수 |
엔진 내장 관측→코드 수준 제어→운영 자동화→분산 조정으로 이어지는 계층을 맞물리면, 락 호환성 매트릭스의 효과 (안전한 충돌 회피) 를 성능/확장성과 함께 가져갈 수 있다.
실무 적용 및 사례
실습 예제 및 코드 구현
실습 예제: Python 으로 S/X Lock 호환성 매트릭스 구현
목적
- 락 호환성 매트릭스의 기본 원리를 코드로 직접 경험하고 여러 트랜잭션의 동시 접속 허용/차단을 시뮬레이션
사전 요구사항
- Python 3.x, 표준 라이브러리만 필요
단계별 구현
1 단계: 락 모드 및 호환성 매트릭스 설계
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15# 락 모드 정의 및 매트릭스 모델 (주석 포함) LOCK_MODES = ['S', 'X'] COMPATIBILITY_MATRIX = { ('S', 'S'): True, # 공유끼리 허용 ('S', 'X'): False, # S와 X 충돌 ('X', 'S'): False, # X와 S 충돌 ('X', 'X'): False, # 배타적끼리 충돌 } def check_compatibility(current_locks, requested_lock): """현재 락들 중 요청 락과 충돌 여부 검사 함수""" for lock in current_locks: if not COMPATIBILITY_MATRIX.get((lock, requested_lock), False): return False return True2 단계: 트랜잭션 시뮬레이션
실행 결과
호환됨: S 락끼리는 동시 가능
충돌: S/X 또는 X/X 는 동시 불가
추가 실험
- 락 모드 추가 (IS/IX/SIX), 복수 트랜잭션 동시 접근, 데드락 상황 실험 등으로 확장 가능
실습 예제: " 동일 레코드 갱신 충돌 시 호환성 관찰 (PSQL + Python)”
목적
- S/X/U 모드 호환성과 대기/타임아웃 관찰.
사전 요구사항
- PostgreSQL 15+
- psycopg
- 두 개 세션.
단계별 구현
세션 A: 트랜잭션 시작 후
SELECT … FOR UPDATE로 레코드 잠금.세션 B: 같은 레코드에 UPDATE 시도 → 대기/타임아웃.
SKIP LOCKED로 회피 패턴 실습.1 2 3 4 5 6 7 8 9 10 11 12 13-- 준비 CREATE TABLE demo(id int primary key, v int); INSERT INTO demo VALUES (1, 100) ON CONFLICT DO NOTHING; -- 세션 A BEGIN; SELECT * FROM demo WHERE id=1 FOR UPDATE; -- X와 충돌하는 강한 잠금 -- 커밋 지연 -- 세션 B (동시에) BEGIN; UPDATE demo SET v = v + 1 WHERE id=1; -- 세션 A가 해제할 때까지 대기 -- 타임아웃 설정 가능: SET lock_timeout = '3s';1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26# Python 동시성 관찰(의사코드; psycopg 사용) import psycopg import threading, time DSN = "postgresql://user:pw@localhost:5432/mydb" def session_a(): with psycopg.connect(DSN) as conn: conn.execute("BEGIN") conn.execute("SELECT * FROM demo WHERE id=1 FOR UPDATE") time.sleep(5) # 잠금 유지 conn.execute("COMMIT") def session_b(): with psycopg.connect(DSN, autocommit=False) as conn: conn.execute("SET lock_timeout = '3000ms'") try: conn.execute("UPDATE demo SET v=v+1 WHERE id=1") conn.execute("COMMIT") except Exception as e: print("B timeout/block:", e) conn.execute("ROLLBACK") threads = [threading.Thread(target=session_a), threading.Thread(target=session_b)] [t.start() for t in threads] [t.join() for t in threads]
실행 결과
- 세션 B 는 A 의 X 급 잠금과 충돌로 대기→타임아웃.
SKIP LOCKED로 회피 가능.
추가 실험
- 인덱스 범위 질의 + SERIALIZABLE 에서 팬텀 방지 확인.
5.2 실제 도입 사례 분석
실제 도입 사례: PostgreSQL 의 다중 그래뉼래리티 락킹
배경 및 도입 이유
PostgreSQL 은 테이블과 행 수준에서 동시에 락킹을 지원해야 하는 필요성에 직면했다.
단순한 테이블 레벨 락만으로는 동시성이 떨어지고, 행 레벨 락만으로는 대량 작업 시 오버헤드가 컸습니다.
이를 해결하기 위해 의도 락을 포함한 확장된 호환성 매트릭스를 도입했다.
구현 아키텍처
graph TB
subgraph "PostgreSQL Lock Architecture"
A[Transaction Manager] --> B[Lock Manager]
B --> C[Lock Table]
B --> D[Wait Queue]
C --> E[Table Level Locks]
C --> F[Row Level Locks]
E --> G[ACCESS SHARE]
E --> H[ROW SHARE]
E --> I[ROW EXCLUSIVE]
E --> J[SHARE UPDATE EXCLUSIVE]
E --> K[SHARE]
E --> L[SHARE ROW EXCLUSIVE]
E --> M[EXCLUSIVE]
E --> N[ACCESS EXCLUSIVE]
end
PostgreSQL 은 8 가지 테이블 레벨 락 모드와 이들 간의 복잡한 호환성 매트릭스를 구현했다.
각 락 모드는 특정 SQL 명령에 최적화되어 있다.
핵심 구현 코드
| |
성과 및 결과
- 정량 지표:
- 동시성 30% 향상 (혼합 워크로드에서)
- 락 대기 시간 40% 감소
- DDL 작업 중 SELECT 쿼리 처리 가능
- 정성 개선:
- 애플리케이션 개발자의 락 이해도 향상
- 데드락 발생률 감소로 운영 안정성 개선
교훈 및 시사점
PostgreSQL 사례에서 얻을 수 있는 핵심 교훈은 단순함과 완전성의 균형.
8 개의 락 모드는 복잡해 보이지만, 각각이 특정 SQL 명령에 최적화되어 있어 개발자가 명령별로 예상할 수 있는 락 동작을 제공한다.
또한 VIEW 를 통한 락 상태 모니터링 기능은 실무에서 매우 유용한 디버깅 도구가 되고 있다.
실제 도입 사례: PostgreSQL 대형 트랜잭션 DB
배경 및 도입 이유
- 금융/쇼핑몰 등 대규모 환경에서 트랜잭션의 무결성과 동시성 보장 핵심 요구
- S/X/Intention Lock 체계 도입으로 운영 효율과 확장성 확보
구현 아키텍처
graph TB
App[Application Server] --> PG[PostgreSQL DBMS]
PG --> LockMgr[Lock Manager]
LockMgr --> Table[Table/Row]
핵심 구현 코드
성과 및 결과
- 여러 트랜잭션이 동시 처리돼도 Dirty Read/Lost Update 없이 안정적 운영
- 락 경합 발생시에도 빠른 탐지 및 자동 롤백으로 서비스 중단 대폭 감소
교훈 및 시사점
- 락 호환성 및 매트릭스 관리가 자동화되어 있더라도, 고성능 시스템에서는 락 충돌/대기/데드락 이슈를 모니터링하고 최적화하는 절차가 반드시 필요하다
락 매트릭스 연계·운영 아키텍처
락 매트릭스는 “같이 잡아도 되는가?” 를 표로 빠르게 판단한다. 하지만 실서비스에서는 이 판단이 MVCC·범위락·분산 합의·메시징·복구·관측과 함께 설계되어야 전체 일관성과 처리량이 나온다.
락 매트릭스 연계 아키텍처 지도
| 통합 축 | 왜 (문제/목표) | 무엇 (핵심 개념) | 어떻게 (연계 방식) | 획득 가치 |
|---|---|---|---|---|
| DB 내부 (MVCC·범위락·MGL) | 읽기 비차단·팬텀 방지·계층 충돌 최소화 | MVCC, 넥스트 - 키/갭락, IS/IX/SIX | 읽기는 MVCC, 직렬 필요 구간만 레인지락 활성·MGL 로 상→하 의도 잠금 | 동시성↑, 직렬성 요구 구간만 비용 지불. |
| 분산/합의·복제 | 노드/리전 분산에서 동일 락·커밋 보장 | 2PC, Paxos/Raft, 분산 락 (세션/리스) | 트랜잭션은 2PC, 메타데이터/리더선정· coarse lock 은 ZooKeeper/etcd | 일관성·가용성 균형, 리더 기반 직렬화. |
| 메시징/이벤트 | DB 변경과 이벤트 발행의 원자성 | Outbox, CDC, Idempotent/Transactional Producer | DB 트랜잭션에 outbox 쓰기→CDC(Debezium)→Kafka 전송; 프로듀서 EOS/컨슈머 Idempotent | 이중쓰기 불일치 제거·재시도 안전. |
| 로그/복구/CDC | 충돌/장애 시 재실행과 데이터 복구 | WAL/ARIES, Logical Decoding | 변경을 WAL 에 선기록→복구·CDC 로 외부 파이프 전달 | 내구성·포렌식·아웃박스에 근거 제공. |
| 관측/모니터링 | 락 대기·데드락 가시화·튜닝 | pg_locks, Performance Schema, Extended Events, OTel | 시스템 뷰/이벤트로 락·대기·데드락 수집, OTel 로 지표/트레이싱 | 원인 추적·임계치/에스컬레이션 튜닝 근거. |
| 캐시 연계 | 읽기 경합·차단 완화 | Cache-Aside | 캐시 미스시 DB 조회·쓰기, 적절 만료/무효화 | 읽기 부하 우회·락 경합 감소. |
락 연계 기술 6 대 카테고리
DB 내부 일관성 보강
- 목적: 읽기 비차단과 직렬가능 구간의 공존.
- 방법: 기본은 MVCC, 직렬성이 필요한 쿼리·구간은 넥스트 - 키/레인지락 활성. MGL(IS/IX/SIX) 로 상위에서 충돌 신호.
| 요소 | 적용 포인트 | 주의 |
|---|---|---|
| MVCC | 읽기 경합 완화 | SI 는 비직렬 사례 존재→SSI/범위락 병행 |
| 넥스트 - 키 | 팬텀 방지 | 스캔 범위가 넓으면 차단↑ |
| MGL | 계층 충돌 최소 | 에스컬레이션 임계 튜닝 |
- 요약: " 대부분은 MVCC 로, 꼭 필요한 범위만 강하게 잠근다."
분산 합의·복제/리더십·분산 락
- 목적: 멀티노드에서 동일한 커밋·락 의미 보장.
- 방법: 트랜잭션은 2PC, 메타데이터/리더·coarse 락은 ZooKeeper/etcd(리스 기반), 글로벌 DB 는 합의 +2PC(Spanner).
| 요소 | 역할 | 포인트 |
|---|---|---|
| 2PC | 분산 커밋 | 가용성 - 일관성 트레이드오프 |
| ZooKeeper/etcd 락 | 리더·분산 락 | 세션/리스 만료로 안전 해제 |
| TrueTime+ 합의 | 외부일관성/직렬화 | 잠금 비용 줄인 강일관성 읽기 |
- 요약: " 글로벌 일관성은 합의 +2PC로, 운영 락은 분산 락 서비스로."
메시징 연계 (Outbox·Kafka EOS·멱등성)
- 목적: DB 상태와 이벤트 발행의 원자성, 중복 안전.
- 방법: 서비스는 트랜잭션 안에서 Outbox 테이블에 기록→Debezium CDC가 Kafka 로 전송. Idempotent/Transactional Producer와 Idempotent Consumer로 재시도·중복 대응.
| 요소 | 효과 | 포인트 |
|---|---|---|
| Outbox+CDC | 이중쓰기 분리·원자성 | DB 커밋=이벤트 발행 근거 |
| Kafka EOS | 다파티션 원자 쓰기 | Tx Producer/Idempotent |
| 멱등성 키 (API) | 재시도 안전 | 요청 재실행=동일 결과 |
- 요약: “DB 커밋을 출발점으로, 메시지는 멱등·트랜잭션으로.”
로그·복구·CDC 연동
- 목적: 장애/재시도에서 정합 복원과 외부 연동.
- 방법: WAL/ARIES로 선기록→복구, Logical Decoding으로 변경 스트림을 생성 (Outbox/데이터 파이프).
| 요소 | 역할 | 포인트 |
|---|---|---|
| WAL/ARIES | 내구성·복구 | 로그 우선·재실행 |
| Logical Decoding | CDC 스트림 | 슬롯·플러그인 포맷 |
- 요약: “로그가 진실의 원천—복구·CDC 의 근거.”
관측/모니터링 (시스템 뷰·이벤트·OTel)
- 목적: 락 대기/데드락/에스컬레이션 가시화와 튜닝.
- 방법: Postgres pg_locks/Wait Events, MySQL Performance Schema data_locks/data_lock_waits, SQL Server Extended Events(deadlock), OTel DB span/metrics.
**
| 요소 | 무엇을 봄 | 활용 |
|---|---|---|
| pg_locks | 보유/대기 락 | 핫스팟·대기 그래프 파악 |
| data_locks/_waits | 보유↔대기 매핑 | 차단 체인 분석 |
| Extended Events | 데드락 그래프 | 원인 SQL·리소스 특정 |
| OTel SemConv | 지연/에러 지표 | 서비스 전반 트레이싱 |
- 요약: " 잠금은 보이는 순간 해결이 빨라진다."
캐시 연계 (Cache-Aside)
- 목적: 읽기 경합·락 대기 감소.
- 방법: Cache-Aside로 캐시 미스시 DB 조회 후 캐시에 저장, 만료·무효화 정책 정립.**
| 요소 | 효과 | 주의 |
|---|---|---|
| Cache-Aside | 읽기 부하 우회 | 일관성/TTL·무효화 |
- 요약: " 읽기는 캐시가, 무결성은 DB 가."
락 연계 기술 한눈에 보기
| 카테고리 | 핵심 기술 | 왜 | 어떻게 | 기대 효과 |
|---|---|---|---|---|
| A DB 내부 | MVCC·넥스트 - 키·MGL | 읽기 비차단·팬텀 방지 | MVCC 기본, 직렬 구간만 레인지락 | 동시성↑, 필요한 곳만 강보호 |
| B 분산/합의 | 2PC·Paxos/Raft·분산락 | 노드 간 동일 의미 | 2PC 커밋, 리더·coarse 락은 ZooKeeper/etcd | 글로벌 일관성·가용성 균형 |
| C 메시징 | Outbox·Debezium·Kafka EOS·멱등성 | DB↔이벤트 원자성 | 트랜잭션 내 outbox, CDC→Kafka, EOS/Idempotent | 이중쓰기 불일치 제거·중복 안전 |
| D 로그/복구/CDC | WAL/ARIES·Logical Decoding | 장애 복구/변경 전파 | 로그 선기록·복구, 로그 디코딩으로 스트림 | 내구성·데이터 파이프 기반 |
| E 관측 | pg_locks·PerfSchema·Ext.Events·OTel | 원인 추적/튜닝 | 락/대기/데드락 수집·추적 | 병목 제거·임계치 최적화 |
| F 캐시 | Cache-Aside | 읽기 락 경합 완화 | 캐시 미스시 로드·만료/무효화 | 대기 단축·처리량↑ |
최종 정리 및 학습 가이드
내용 종합
LCM 은 “어떤 락끼리 같이 써도 되는가” 를 미리 만든 표다. 데이터가 테이블→행→인덱스 키처럼 계층이기 때문에, 하위에서 락을 잡을 계획이면 상위에 의도 락 (IS/IX/SIX) 으로 신호를 준다. 읽기만 많이 할 땐 S↔S가 함께 가능해 처리량이 올라가고, 쓰기 경쟁은 X로 고립된다.
범위 검색에서는 새 행이 끼어드는 팬텀을 막아야 하는데, PostgreSQL 은 프레디케이트 (SIREAD), SQL Server 는 키 - 범위, MySQL 은 넥스트키로 해결한다. 모든 엔진은 2PL 과 LCM 을 묶어, 허용/대기를 즉시 결정해 정확성과 성능을 동시에 챙긴다.
실무 적용 가이드
| 단계/영역 | 핵심 체크포인트 | 주요 작업 | 핵심 지표/알림 | 대표 도구/명령 | 근거 |
|---|---|---|---|---|---|
| 도입/설계 | 일관성·격리수준 정의, 경합 표면 최소화 | 인덱스/파티션 설계, 범위 보호 (필요 시) | 예상 대기·타임아웃 예산 | (공통) 설계 문서/아키텍처 리뷰 | InnoDB 넥스트키, Oracle LOCK TABLE (MySQL 개발자 존) |
| 운영/모니터링 | 대기/데드락/에스컬레이션 상시 관측 | 대시보드/알림, 로그 기반 잠금 대기 추적 | 락 대기시간, 데드락 수, 타임아웃 수 | Postgres pg_locks,pg_stat_activity,log_lock_waits | PG 뷰·파라미터 문서 (PostgreSQL) |
| 〃 | 〃 | 〃 | 〃 | MySQL performance_schema.data_locks/data_lock_waits | InnoDB Locking/PS 문서 (MySQL 개발자 존) |
| 〃 | 〃 | 〃 | 〃 | SQL Server sys.dm_tran_locks + Extended Events | DMV/XE 공식 문서 (Microsoft Learn) |
| 트러블슈팅 | 블로킹 체인 파악, 범위 겹침 여부 | 긴 트랜잭션 분리, 락 순서 통일, 인덱스 보강 | 평균 대기/최장 대기, 차단 세션 수 | 엔진별 뷰/DMV/PS + 쿼리 재계획 | InnoDB 스캔→락 범위 설명 (MySQL 개발자 존) |
| 확장/분산 | 읽기 - 쓰기 분리·샤딩, 최신 기능 | 읽기 복제본/RCSI·SI, 샤딩·파티션, Optimized Locking | 대기 분포, 에스컬레이션 수 | 엔진 옵션 (RCSI/SI), SQL Server Optimized Locking | 공식 가이드·기능 문서 (Microsoft Learn) |
| 변경관리 | 정책·임계치·테스트 주기화 | 데드락 정책/로그 리뷰, 릴리스 전후 락 회귀 테스트 | 릴리스별 대기·데드락 추이 | CI 파이프라인·부하테스트 | PG log_lock_waits 활용 (PostgreSQL) |
학습 로드맵
| Phase | 기간 (권장) | 핵심 주제 | 성과물 (Outcome) | 필수 레퍼런스 |
|---|---|---|---|---|
| 1 기본 | 1–2 주 | 모드 (S/X/IS/IX/SIX), 5×5 매트릭스, 2PL | 미니 락 매니저 (요청→판정→대기/해제) 구현 노트 | PG Explicit Locking, LOCK 문서 (PostgreSQL) |
| 2 MGL | 2–3 주 | 의도 잠금·계층 락킹·에스컬레이션 | IS/IX/SIX 시나리오 도식·호환성 퀴즈 | Gray MGL 논문 (CMU 컴퓨터 과학 학교) |
| 3 범위 | 3–4 주 | 프레디케이트·키 - 레인지·넥스트 - 키 | InnoDB 데모 (갭/넥스트 - 키) 재현 스크립트 | EGLT·MySQL 문서 (컴퓨터 과학 부서 - 크레타 대학교) |
| 4 MVCC/SSI | 4–5 주 | SI 특성·SSI·범위락 병행 | SI 에서의 비직렬 사례 재현·SSI/레인지락 비교표 | Fekete 2005 (버클리 데이터 시스템 및 기초 그룹) |
| 5 제품별/운영 | 지속 | 엔진별 차이·모니터링·튜닝 | pg_locks/Perf Schema/Ext.Events 대기 분석 리포트, SKIP LOCKED 큐 소비기 | PG/SQL Server 가이드 (PostgreSQL) |
학습 항목 정리
| 단계 | 세부 항목 | 목표 | 실무 연관성 | 설명 |
|---|---|---|---|---|
| 1 기본 | 모드 정의 (S/X/IS/IX/SIX) | 각 모드 의미·의도 신호 이해 | 높음 | 상위→하위 의도 잠금, 실충돌은 S/X/SIX 위주. |
| 1 기본 | 5×5 매트릭스 판독 | 허용/충돌 전부 판단 | 높음 | " 요청×보유 " 전원 호환일 때만 부여. |
| 1 기본 | 2PL 파이프라인 | Growing/Shrinking·Grant/Wait/Detect | 높음 | 데드락 탐지/예방 개념 포함. |
| 2 MGL | IS/IX/SIX 규칙 | 계층 자원에서 빠른 충돌 판정 | 높음 | 의도 잠금으로 에스컬 안전화. |
| 2 MGL | 에스컬레이션 | 임계→상위 락 승격 기준 | 중간 | 메모리·차단 트레이드오프. |
| 3 범위 | 프레디케이트 락 | 팬텀 이론 이해 | 중간 | 실무에선 비용↑, 개념적 기준점. |
| 3 범위 | 넥스트 - 키 (레코드 + 갭) | 팬텀 실무 방지 | 높음 | 인덱스 스캔 범위에 락 설정. |
| 4 MVCC/SSI | SI 와 직렬성 간극 | 왜 SSI/범위락이 필요한가 | 높음 | SI 만으로는 특정 패턴에서 비직렬. |
| 4 MVCC/SSI | SSI/범위락 병행 | 직렬 가능 보장 설계 | 높음 | 워크로드에 맞춘 병용 전략. |
| 5 제품/운영 | SKIP LOCKED | 큐 처리 경합 회피 | 중간 | 멀티 컨슈머 병행 처리. |
| 5 제품/운영 | 관측 지표 | 보유/대기/데드락 시각화 | 높음 | pg_locks·Perf Schema·Ext.Events. |
용어 정리
| 카테고리 | 용어 (한글, 영문, 약어) | 정의 | 관련 개념 | 실무 활용 |
|---|---|---|---|---|
| 핵심 개념 | 락 호환성 매트릭스 (Lock Compatibility Matrix, 없음) | 락 모드 간 동시 보유 가능 여부를 2 차원 표로 정리한 규칙 집합. 부여/대기 판단의 기준. | 트랜잭션, 충돌, 동시성 | DDL/DML 설계, 충돌 예측, 성능 튜닝 |
| 프로토콜 | 두 단계 잠금 (Two-Phase Locking, 2PL) | 확장 단계 (획득만) 와 수축 단계 (해제만) 로 잠금을 관리해 충돌 직렬성을 보장하는 방식. | 직렬성, 교착 | 트랜잭션 정책 수립, 커밋 시 일괄 해제 |
| 락 모드 | 공유 락 (Shared Lock, S) | 읽기 공유를 허용하나 쓰기와는 비호환인 잠금 모드. | 읽기 일관성 | SELECT 시 충돌 억제 |
| 락 모드 | 배타 락 (Exclusive Lock, X) | 쓰기 전용으로, 다른 모든 락과 거의 비호환. | 쓰기 일관성 | UPDATE/DELETE 시 무결성 보장 |
| 락 모드 | 업데이트 락 (Update Lock, U) | S↔X 전환 시 데드락을 줄이기 위한 중간 모드 | S/X 전환 | 갱신 후보 행 선점 시 유용 |
| 락 모드 | 의도 락 (Intention Lock, IS/IX/SIX) | 하위 그라뉼러리티에서 잠금을 잡을 의도를 상위 노드에 선언하는 테이블 수준 잠금. | 다중 그라뉼러리티 | 대용량 동시성에서 충돌 탐지·비용 절감 |
| 범위·격리 | 키 - 범위 락 (Key-Range Lock, 없음) | 인덱스 키와 키 사이의 범위를 보호해 팬텀을 방지하는 잠금 (직렬화 격리 맥락). | 팬텀 리드, SERIALIZABLE | 범위 조회/갱신의 일관성 확보 |
| 범위·격리 | 스냅샷 격리 (Snapshot Isolation, SI/RCSI) | 버전 읽기로 읽기 - 쓰기 충돌을 줄이는 격리. 필요 구간만 잠금 강화. | MVCC, 비차단 읽기 | 읽기 우세 워크로드의 대기 감소 |
| 운영·정책 | 잠금 에스컬레이션 (Lock Escalation, 없음) | 많은 미세 락을 상위 (페이지/테이블) 락으로 승격해 리소스를 절약. Learn][5]) | 메모리 관리, 경합 | 대량 처리 시 자동/정책 기반 승격 |
| 운영·정책 | 데드락 (Deadlock, 없음) | 트랜잭션들이 서로의 자원을 기다려 진행 불가인 순환 대기 상태. | Wait-for 그래프 | 감지기/피해자 선택, 재시도 설계 |
| 운영·정책 | 락 타임아웃 (Lock Timeout, 없음) | 대기 시간이 임계치를 넘으면 요청을 중단하는 정책. | 서비스 수준, 재시도 | SLA 보호, 재시도·멱등 처리 |
| 모니터링·진단 | 락 관리자 (Lock Manager, 없음) | 락 테이블·대기열을 관리하고 호환성 판정을 수행하는 엔진 구성요소. | 호환성 매트릭스 | 부여/대기 결정, 통계 수집 |
| 모니터링·진단 | 락 테이블/대기열 (Lock Table/Queue, 없음) | 현재 보유/대기 락의 상태 저장 구조. | Wait-for 그래프 | 병목 분석, 우선순위 조정 |
| 모니터링·진단 | 대기 - 그래프 (Wait-for Graph, 없음) | 트랜잭션 간 대기 관계를 나타내는 그래프 (사이클=데드락). | 데드락 감지 | 자동 감지·피해자 선정 |
| 모니터링·진단 | 잠금 모니터링 뷰 (pg_locks 등, 없음) | 현재 잠금 현황을 조회하는 뷰/DMV. PostgreSQL 의 pg_locks 가 대표적. | 블로킹, 경합 | 실시간 진단·튜닝 |
참고 및 출처
- PostgreSQL Documentation – Concurrency Control (MVCC & Locks)
- PostgreSQL Documentation – Explicit Locking
- MySQL 8.0 Reference – InnoDB Locking
- Microsoft SQL Server – Transaction Locking and Row Versioning Guide
- Oracle Database Concepts – Data Concurrency and Consistency
- IBM Db2 Documentation – Locking
- MongoDB Manual – FAQ: Concurrency
- CockroachDB Docs – Transaction Layer
- Apache ZooKeeper – Recipes and Solutions (Locks 섹션 포함)
- Google Research – Spanner: TrueTime and External Consistency
- Velog – DB Concurrency Control
- Tistory – Multiple Granularity Locking
- Velog – Lock의 종류와 적용 사례