Intent Modes

Intent Modes(의도 잠금) 는 다중 그라뉼러리티 잠금 (MGL) 에서 상위 노드에 " 하위에서 어떤 락을 걸 계획인지 " 를 선행 표명하는 경량 잠금이다.

기본형은 IS(하위에 S 예고), IX(하위에 X 예고), SIX(테이블은 공유 읽기 허용 + 일부 하위는 배타 갱신) 이며, 트랜잭션은 하위 락을 잡기 전에 반드시 대응되는 의도 락을 상위에 먼저 획득한다 (예: 행 X → 테이블 IX, 행 S → 테이블 IS).
이 구조 덕분에 엔진은 상위 수준에서 Lock Compatibility Matrix만 조회해 대규모 작업 (테이블 스캔·DDL) 과 미세 작업 (개별 행 갱신) 의 충돌 여부를 빠르게 판정하고, 불필요한 광역 차단을 피한다.
의도 락은 2PL과 결합해 직렬가능성 달성에 기여하며, 에스컬레이션·파티셔닝 같은 운영 전략과도 잘 맞는다.
MVCC를 쓰는 엔진에서도 DDL/테이블 락, 인덱스 범위 잠금 등에는 의도 락 규칙이 여전히 적용된다.

실무에서는 " 가능한 가장 약한 모드 " 를 선택하고, 접근 범위를 인덱스로 좁히며, 락/대기 지표로 교착과 에스컬레이션을 상시 점검하는 것이 핵심이다.

의도 잠금: 개념·관계·실무 통합

의도 잠금은 “아래에서 어떤 락을 잡을지” 를 위에 먼저 알려, 빠르고 안전하게 동시성을 높이는 기술.

의도 잠금 핵심 개념

개념 (한글·약어)정의왜 중요한가핵심 규칙/포인트대표 상황
의도공유잠금 (IS)하위에서 S 를 잡을 의도상위에서 빠른 판정IS 는 IS/IX/S/SIX 와 주로 호환읽기 전용 스캔 시작
의도배타잠금 (IX)하위에서 X(또는 갱신) 의도충돌 국소화·업데이트 준비IX 는 S/SIX/X 와 충돌, IS/IX 와 호환OLTP 단건 업데이트
공유 + 의도배타 (SIX)상위 S+ 하위 일부 X대량 읽기 + 부분 수정대부분과 충돌 (강한 보호)보고서 + 부분 갱신
호환성 매트릭스모드 간 공존 표즉시 Grant/Wait 판정" 요청×보유 " 전원 호환 시 부여모든 요청 공정 처리
2 단계잠금 (2PL)확장→수축 규율직렬 가능 충분조건축소기 진입 후 신규 획득 금지트랜잭션 전반 규율
락 변환/에스컬레이션S→X, 하위→상위 승격메모리·메타락 절감동시성 손실·데드락 주의대량 행 갱신
범위/프레디케이트/넥스트 - 키범위 단위 보호팬텀 차단·직렬화필요한 구간에만 사용고정밀 집계·검증 쿼리
데드락/기아순환 대기/우선순위 불균형가용성·SLO 보호탐지·예방·타임아웃·순서고정고경합 트래픽

IS/IX/SIX 는 신호, S/X 는 실행이다. 매트릭스가 즉시 판정을, 2PL 이 시간 규율을, 범위락이 팬텀 방지를 담당한다. 에스컬레이션과 업그레이드는 효율 vs 동시성의 교환이다.

의도 잠금 상호관계 매핑표

From → To관계/방향성목적 (무엇을 위해)효과 (어떤 결과)비고
의도잠금 → 호환성 매트릭스" 신호→판단 "상위 단계 즉시 충돌 판정불필요 탐색 감소·대기 단축IS/IX/SIX 가 선행
의도잠금 → 2PL" 획득 규율 "상→하 순서로 안전 확장업그레이드 충돌 감소확장기 준수
의도잠금 ↔ 에스컬레이션" 승격 보호 "승격 시 안전성 확보예측 가능 튜닝임계 기반
범위잠금 ↔ 의도잠금" 정밀 적용 "팬텀 방지 대상 한정차단 최소화인덱스와 결합
업그레이드 → 데드락" 위험 경로 "S→X 시 사이클 예방순서 고정·분리 설계고경합 구간
관측 (뷰) → 튜닝 (정책)" 피드백 루프 "병목 식별·임계 조정처리량↑·지연↓운영 반복

의도 잠금은 관계의 허브다. " 신호→판단→규율→승격→정밀화→관측·튜닝 " 의 루프가 성능과 정합성을 함께 끌어올린다.

의도 잠금의 실무 적용 맵

개념무엇 (실체)어떻게 (절차/패턴)왜 (효과/지표)위험/주의체크리스트
IS읽기 의도 신호트랜잭션 시작 시 상위에 IS대기율↓, 스캔 공존↑상위 락 과도 남용 주의" 읽기면 IS 먼저?"
IX갱신 의도 신호상위 IX 후 행/키 X충돌 국소화·응답 안정IX↔S 충돌로 스캔 지연“IX 후 바로 X?”
SIXS+ 부분 X테이블 S + 일부 X리포트 + 부분 수정 최적광범위 차단 위험" 정말 SIX 가 필요한가?"
호환 매트릭스판정 표요청×보유 전원 호환 검사즉시 Grant/Wait표 불일치 해석 금지" 표대로 해석?"
2PL시간 규율확장기→축소기직렬 가능성·예측성축소기 이후 획득 금지" 축소기 진입 시점?"
에스컬레이션승격임계 초과 시 상위 승격메타락/메모리 안정동시성 급락" 임계값·시간대?"
범위락범위 보호키 - 레인지 잠금팬텀 0, 정확성↑스캔 차단↑" 정말 직렬 구간?"
데드락 관리탐지/예방순서 고정·타임아웃가용성·SLO 보호과도 중단/기아" 정책 균형?"
관측/튜닝뷰·이벤트·지표보유/대기/대기체인 분석병목 제거·SLA 준수과최적화 경계" 지표 세트 정했나?"

IS/IX/SIX 는 언제·어디서 락을 강하게 쓸지 선언하게 해준다. 운영은 매트릭스·2PL·에스컬레이션·범위락을 정책으로 엮고, 관측으로 피드백한다.

Lock Compatibility Matrix

ISIXSSIXX
IS
IX
S
SIX
X

핵심 기억법
X=올금지, SIX=IS 만 허용, S=IS/S 만, IX=IS/IX 만, IS=거의 다 허용 (단 X 제외)

기초 조사 및 개념 정립

의도 락을 이해하기 위한 최소 단위

의도 락은 " 이 테이블 안쪽에서 이런 종류의 락을 곧 쓸 거야 " 를 미리 알리는 신호다. 그래서 락 관리자는 굳이 모든 행을 살피지 않고도 충돌 여부를 빨리 판단한다.
작업 순서는 항상 상위부터 (예: 테이블에 IS/IX/SIX) 잠그고, 그다음 하위 (행) 에 S/X 를 건다.
많은 읽기와 일부 쓰기가 섞이면 테이블에 SIX 를, 실제 수정할 행에 X 를 걸어 불필요한 대기와 교착을 줄인다.

의도 락의 개념과 동작 핵심
의도 모드의 구조, 규칙, 효용

의도 락의 탄생과 현대적 진화

Intent Modes 는 계층형 데이터 자원(테이블→페이지→행) 에서 “아래에서 S/X 를 잡을 예정” 이라는 ** 의도 (IS/IX/SIX)** 를 상위에 미리 표시해 충돌을 즉시 식별하게 만든다. 이렇게 하면 테이블 전수락으로 동시성이 떨어지는 문제와, 행 단위로만 관리해 락 수·탐색 비용이 커지는 문제를 동시에 줄인다. 이후 상용 DB 는 락 에스컬레이션·큐 공정성을 더해 운영성을 높였고, MVCC와 결합해 읽기는 버전, 쓰기는 Intent+ 락으로 정합성과 처리량을 함께 얻는다. 최신 엔진은 키 - 범위/넥스트키/U 락을 더해 팬텀 방지·교착 완화까지 노린다.

등장 배경
발전 과정
  1. 다중 그레뉼러리티 이론 제시 (1970s 중반)
    • 등장 이유: SG 의 과도한 경합·탐색 비용 해결.
    • 개선점: **의도 신호 (IS/IX/SIX)**로 상위에서 빠른 충돌 판정·탐색 회피.
  2. 상용 DB 채택 (1980s–1990s)
    • 등장 이유: 대형 OLTP 확산, 락 메모리와 대기 관리 필요.
    • 개선점: 에스컬레이션 정책·락 큐 공정성·모니터링 도입으로 운영 안정성 향상.
  3. MVCC 확산과 하이브리드 (2000s)
    • 등장 이유: 읽기 병렬성 극대화 요구.
    • 개선점: 읽기=버전, 쓰기/DDL/범위=Intent+ 락으로 정합성과 처리량 균형.
  4. 범위·업데이트 락 등 현대 확장 (2010s–현재)
    • 등장 이유: 팬텀 방지·변환 교착 완화 요구.
    • 개선점: 키 - 범위/넥스트키/U 락 등으로 직렬가능성교착 감소 동시 달성.
단계시기왜 등장했는가어떤 개선이 이뤄졌나남은 과제
이론 제안1970s 중반SG 병목·행락 오버헤드IS/IX/SIX 로 상위에서 빠른 충돌 판정규칙 설계·튜닝 필요
상용화1980s–1990s대규모 OLTP 운영성 요구에스컬레이션·락 큐 공정성·모니터링승격 임계·공정성 트레이드오프
MVCC 결합2000s읽기 병렬성 확대읽기=버전, 쓰기=Intent+ 락 하이브리드버전 GC·쓰기 경합 관리
현대 확장2010s–현재직렬가능성·교착 완화키 - 범위/넥스트키/U 락 도입비용·복잡도 관리
timeline
  title Intent Modes 발전 연대표
  1970s 중반 : 다중 그레뉼러리티 락 이론 제시(IS/IX/SIX)
  1980s–1990s : 상용 DB 채택 · 에스컬레이션/모니터링 도입
  2000s : MVCC 확산 · 읽기-쓰기 하이브리드 정착
  2010s–현재 : 키-범위/넥스트키/U 락 등 확장 · 교착 완화

Intent Modes 는 SG 병목 vs 행락 오버헤드의 딜레마를 상위 의도 신호로 해소하고, 상용화 과정에서 운영 안정성, MVCC 결합으로 읽기 병렬성, 현대 확장으로 직렬가능성·교착 완화까지 확보했다.

의도 모드로 여는 동시성·안정성의 균형

의도 모드는 " 행/페이지 같은 하위 자원에 S/X 락을 걸 계획 " 을 테이블 같은 상위 자원에 미리 표시하는 장치다.
덕분에 엔진은 하위 전체를 훑지 않고도 상위에서 허용/대기를 즉시 판단한다.
읽기는 함께, 갱신은 충돌 시 조기 차단하도록 유도해 처리량을 높이고, 락 획득 순서를 규율해 교착 가능성을 낮춘다.
다량의 미세 락은 상위 락으로 승격해 운영 비용을 제어한다.

의도 모드가 푸는 핵심 문제
문제기존 한계의도 모드의 개선 방식기대 효과관찰 지표
비싼 충돌 검사하위 전수 검사 필요상위 IS/IX/SIX 로 즉시 판정판정 비용·지연 감소평균 대기시간, 대기 큐 길이
동시성 저하읽기/갱신 혼재 시 경합↑S 허용, IX 로 갱신 충돌 조기 신호처리량 증가, P95 지연 감소TPS/QPS, P95/P99 latency
교착상태불규칙 락 순서상→하 획득 규율화교착 빈도 감소데드락 수, 타임아웃 수
메타데이터 폭주락 수·메모리 증가에스컬레이션 연동메모리·락 수 안정화락 수, 메모리 사용량
DDL 충돌늦은 충돌 발견상위에서 호환성 즉시 노출배포/운영 리스크 감소실패/롤백 건수, 변경창 지연

의도 모드는 상위에서의 즉시 판정과 획득 순서 정규화로 경합·교착·오버헤드를 동시에 줄이고, 에스컬레이션과 결합해 운영 비용을 예측 가능하게 만든다.

의도 모드의 핵심 목적 일람
목적정의구현 포인트성공 기준
빠른 충돌 판정하위 잠금 의도의 상위 표기IS/IX/SIX 호환성 표대기율·판정시간 감소
동시성·일관성 균형읽기 병행·갱신 고립S↔S 허용, IX 충돌 차단TPS↑, 오류·팬텀 0 에 근접
교착 위험 축소락 순서 정규화상→하 획득, 동일 순서 준수데드락/타임아웃↓
자원 사용 제어락 수·메모리 안정화에스컬레이션 임계치 설계락 수·메모리 변동폭↓
운영 안정성DDL/OLTP 공존상위 호환성 즉시 노출배포 실패·롤백 건수↓

목적은 성능·안정·예측 가능성의 동시 달성이다. 구현 포인트는 IS/IX/SIX 운용 규칙과 에스컬레이션·획득 순서 설계다.

문제와 목적의 1:1 연결 맵
해결하는 문제대응 목적연결 고리 (메커니즘)
비싼 충돌 검사빠른 충돌 판정상위 의도 신호와 호환성 표
동시성 저하동시성·일관성 균형S 허용, IX 로 갱신 충돌 차단
교착상태교착 위험 축소상→하 획득, 동일 순서 규율
메타데이터 폭주자원 사용 제어에스컬레이션 임계·정책
DDL 충돌운영 안정성상위에서 호환성 즉시 노출

각 문제는 하나의 목적과 직결되며, 의도 신호·획득 순서·에스컬레이션이 연결 축을 이룬다.

Intent Modes 의 필수 전제와 운영조건

Intent Modes 가 제대로 작동하려면 위계적 자원 구조가 먼저 있어야 한다. 트랜잭션은 하위 락 (S/X) 을 잡기 전에 상위에 IS/IX/SIX로 " 잠글 계획 " 을 알리고, 엔진은 락 호환성 매트릭스로 즉시 허용/대기를 판정한다. 이를 위해 내부에는 빠른 Lock Manager(메모리 락 테이블, 해시/트리 인덱스, 대기열, 데드락 탐지) 가 필요하고, 외부에는 관측 도구알림/테스트 체계가 필요하다. 순수 S/X 또는 MVCC 만으로는 계층 신호가 부족하므로, Intent Modes 는 상·하위 일관성대규모 OLTP 의 예측 가능한 성능을 위한 필수 전제다.

Intent Modes 전제와 요구 핵심
기술적 전제 조건
  1. 계층적 자원 모델 (테이블→페이지→행)

    • 근거: 의도락은 " 상위에 신호, 하위에 실제 잠금 " 구조를 전제.
    • 차별점: 단일 그라뉼러리티 (테이블 전용 잠금) 대비 충돌 표면을 더 미세하게 분산.
  2. 의도 락 모드 집합과 호환성 매트릭스 완비

    • 근거: IS/IX/SIX 가 있어야 상위에서 빠른 충돌 배제가 가능 (결정표 기반 O(1) 판정).
    • 차별점: 순수 S/X 체계만으로는 상·하위 레벨 일관 신호가 부족.
  3. 고성능 Lock Manager 와 메모리 락 테이블

    • 근거: (자원, 모드, 트랜잭션) 기준의 빠른 조회/삽입/갱신·대기열 관리 필요.
    • 차별점: 느린 카탈로그/디스크 접근 기반 관리 대비 대기·경합 급증 억제.
  4. 격리수준·2PL 연동

    • 근거: 매트릭스는 " 부여 규칙 “, 직렬가능성은 2PL 등 프로토콜로 달성.
    • 차별점: 낙관적 CC/MVCC 는 읽기 - 쓰기 충돌 완화에 강점이나, 계층 신호·DDL 보호는 별개.
  5. 데드락 탐지/회피·타임아웃

    • 근거: 의도락 존재 여부와 무관하게 대기 그래프 순환은 발생 가능.
    • 차별점: 단순 테이블락 환경보다 그래프가 커져 탐지 필요성↑.
  6. 관측·진단 인터페이스

    • 근거: 호환 실패 원인·리드 블로커 확인이 실무 필수.
    • 차별점: 블랙박스형 엔진은 튜닝/장애 대응 난이도↑.
시스템/운영 요구사항
  1. 빠른 해시/트리 인덱스 기반 락 조회

    • 근거: 대기/부여 결정이 트랜잭션 지연의 주된 상수항.
    • 차별점: 선형 스캔 구조는 고동시성에서 병목.
  2. 락 에스컬레이션/디에스컬레이션 정책

    • 근거: 락 수·메모리 한도를 넘지 않도록 자동 승격 필요.
    • 차별점: 무정책 환경은 광범위 락 남발 또는 메모리 고갈.
  3. 트랜잭션·배치 설계 지침

    • 근거: 짧은 트랜잭션/일관된 락 순서가 교착·대기 완화.
    • 차별점: MVCC 단독 사용 대비 쓰기 경합이 높은 OLTP 에 효율적.
  4. 모니터링·알림·리그레션 테스트

    • 근거: 스키마/인덱스 변경은 호환성·범위 충돌 양상을 바꿈.
    • 차별점: 사전/사후 테스트 없이는 성능 회귀 리스크 큼.
Intent Modes 운영 전제·요구 일람
구분항목내용/설명근거 (원리)관련 기술 대비 차이점검증 포인트
기술 전제계층적 자원 모델테이블→페이지→행 부모 - 자식 정의의도락은 상위 신호·하위 잠금 전제단일 그라뉼러리티 대비 충돌 분산부모 포인터/식별자 무결성
기술 전제의도락 모드·호환성 표IS/IX/SIX(+S/X/NL) 완비결정표 기반 O(1) 판정S/X 만으론 상하위 신호 부족매트릭스 일관성 테스트
기술 전제Lock Manager/메모리 락 테이블(자원,모드,TX) 키로 빠른 조회·대기열경합 시 상수 지연 최소화카탈로그 의존 대비 저지연평균/최대 조회 지연
기술 전제격리수준·2PL 연동부여 규칙 + 프로토콜 결합직렬가능성 보장 경로 확보MVCC 단독과 상보격리별 충돌/팬텀 시나리오
운영 요구데드락 탐지/타임아웃WFG·타임아웃 정책순환 대기 해소단순 테이블락보다 필수성↑탐지 주기·롤백 비율
운영 요구에스컬레이션 정책락 수/메모리 한도 관리광범위 락 남발 방지무정책 대비 안정성↑승격 임계·부작용 모니터
운영 요구모니터링/알림보유·대기·리드블로커 가시화원인→대응 루프 단축블랙박스 대비 튜닝 용이대기시간·데드락/타임아웃
운영 요구릴리스 전후 테스트스키마/인덱스 변경 검증범위·호환성 변화 흡수사전 테스트 無 대비 리스크↓회귀 케이스 통과율

핵심은 **계층·모드·관리 (전제)**와 **탐지·정책·관측·검증 (운영)**을 함께 갖추는 것. 이 조합이 있어야 Intent Modes 가 성능과 예측 가능성을 동시에 제공한다.

의도 잠금의 본질: 신호·판정·승격의 조화

의도 잠금: 작동 원리와 실무 차별점
위계 전파와 O(1) 판정의 결합

의도 락은 조상 노드에 의도 신호를 남겨 상위 수준에서 compat[M_req][M_hold] 만 보면 된다.
이 상수시간 판정 덕분에 Grant/Wait 결정이 단순·빠르며, 하위 노드 전수 검사를 줄인다.
동일 그레뉼러리티만 쓰는 방식보다 탐색·대기 비용이 체계적으로 낮다.

승격·업그레이드의 안전판

다량의 하위 락을 상위 락으로 에스컬레이션할 때, 상위에 이미 IS/IX/SIX 가 걸려 있으면 호환성 판단과 차단 폭을 예측 가능하게 제어할 수 있다.
반대로 의도 락 없이 S→X 업그레이드는 교착의 단골 경로가 된다.

SIX 의 자리와 한계

SIX는 " 리드 대다수 + 소수 갱신 " 을 한 트랜잭션에서 처리할 때 쓰인다.
리더는 공존 (상위 S), 라이터는 직렬화 (하위 일부 X) 되어 데드락·경합이 줄어 응답 안정성을 준다.
다만 라이터가 다수인 워크로드에선 테이블 수준 차단으로 병목이 될 수 있어, IX+ 행 X파티션 분리가 더 낫다.

범위락과 직렬성 요구 구간

팬텀은 행 단위 호환성만으로는 잡히지 않는다. 키 - 레인지/넥스트 - 키 같은 범위 기반 잠금으로 직렬성 구간을 보호하되, 의도 락으로 적용 범위를 상위에서 한정하여 차단을 최소화한다. MVCC 와 병행 시에도 직렬성이 필요한 구간에선 범위락이 결정적이다.

운영 관측과 표준성

보유/대기/대기체인, 데드락 그래프, 에스컬레이션 카운터 등 운영 메트릭이 풍부하다.
애플리케이션 락이나 분산 락과 달리 데이터 무결성과 직접 결합되어, 장애 재현·원인 분석·튜닝 루프가 표준화되어 있다.

의도 잠금 특징·근거·차별점 정리
특징기술적 근거장점한계/주의다른 기술과의 차별점대표 활용
위계 전파 (상→하)조상 - 자손 의도 신호상위에서 즉시 판정, 탐색 감소의도 메타데이터 비용단일 그레뉼러리티보다 공존성↑대부분의 OLTP
O(1) 호환성 판정정적 5×5 매트릭스예측 가능·빠른 Grant/Wait매트릭스 해석 오류 주의규칙 추정보다 단순·일관고경합 테이블
교착 위험 완화순서 규율·업그레이드 최소화사이클 확률↓완전 제거는 아님순수 탐지/타임아웃 대비 사전 억제장시간 트랜잭션
에스컬레이션 안전상위 IS/IX/SIX 선점승격 시 충돌 예측 용이동시성 급락 가능의도 없음 대비 리스크 낮음배치/대량 갱신
SIX 활용S+ 부분 X리더 공존·라이터 직렬화라이터 많으면 병목IX+ 행 X 대비 경합↓(소수 라이터)리드 90%+ 워크로드
범위락 결합키 - 레인지/넥스트 - 키팬텀 0, 정합성↑차단 폭 커질 수 있음MVCC 단독 대비 직렬성 보장검증·집계 구간
운영 가시성락 테이블/대기 큐/그래프튜닝·재현·분석 용이과최적화 주의앱 락 대비 데이터 일관성 친화장애 분석/튜닝

의도 락으로 만드는 예측 가능한 동시성

의도 락은 " 이 위계 아래에서 어떤 종류의 잠금을 쓸지 " 를 미리 알리는 표지판이다. 이 표지판 덕분에 락 관리자는 충돌을 위에서 빠르게 판정하고, 실제로 잠글 대상만 하위에서 좁혀 잡는다. 그래서 대량 동시성 환경에서도 불필요한 대기와 전역 배타를 줄이고, 예측 가능한 성능과 일관성을 유지할 수 있다.

의도 락의 설계 이유와 품질 목표
왜 필요한가
  1. 대용량 동시성에서의 탐색 비용 절감

    • 상위 객체에 의도를 먼저 표기하면, 락 관리자가 하위 자원까지 내려가지 않고도 충돌 가능성을 초기에 걸러 락 테이블 탐색·대기열 조작 비용을 낮춘다.
  2. 일관된 락 순서로 교착 위험 저감

    • 상위→하위 획득 순서와 IS/IX/SIX 규칙이 결합되어 순환 대기 조건을 약화시킨다 (탐지·해결은 별도 메커니즘).
  3. 부분 갱신이 많은 스캔 패턴 최적화

    • 대량 읽기 + 소량 쓰기 시 SIX(상위 공유 + 하위 배타 의도) 로 불필요한 전역 배타를 피하면서 수정 대상만 X 로 좁힌다.
  4. 에스컬레이션의 안전한 경로 제공

    • 미세 락이 폭증할 때 상위로 승격해 리소스를 보호하되, 의도 락이 상위/하위 호환성의 일관성을 보장한다.
무엇을 개선하나?
의도 락의 동기와 품질 속성 한눈에
구분항목설명기대 효과운영 포인트
설계 동기탐색 비용 절감상위에서 의도 호환성 판정으로 하위 탐색 최소화대기·컨텍스트 스위칭 감소락 테이블 인덱싱/통계 튜닝
설계 동기교착 위험 축소상위→하위 획득 순서 +IS/IX/SIX 규칙데드락 빈도 감소대기 그래프/피해자 정책
설계 동기혼합 워크로드 최적화SIX 로 대량 S + 부분 X 병행처리량 향상·지연 감소수정 대상 식별 인덱스
설계 동기에스컬레이션 안전화미세 락 폭증 시 상위 승격의 일관성 확보메모리 보호·스케일 안정임계치/예외 테이블 관리
품질 속성성능조기 필터링으로 평균/P95 대기 단축TPS/TPM 증가쿼리·인덱스·락 정책 합치
품질 속성일관성S/X 적용 전 상위 호환성 준수데이터 무결성 유지격리수준·키 - 범위 결합
품질 속성확장성그라뉼러리티·정책으로 경합 폭주 억제코어/세션 증가 대응샤딩/파티션 전략
품질 속성신뢰성/예측규칙 기반 설계로 결과 재현장애·튜닝 안정성 향상SLO·알림·런북 정비
품질 속성데드락 억제순서 고정으로 순환 대기 약화중단·롤백 비용 감축타임아웃·재시도 설계

의도 락은 " 상위에서 미리 말하기 " 로 충돌을 조기에 걸러 성능·확장성·예측 가능성을 동시에 끌어올리고, 교착 위험을 구조적으로 낮춘다.

핵심 원리 및 이론적 기반

의도 락: 원칙·철학의 실전 프레임

Intent Modes 는 상위에서 거르고 하위에서 확정한다.

트랜잭션은 먼저 테이블 등 상위 자원에 **의도 락 (IS/IX/SIX)**을 걸어 " 아래에서 S/X 를 쓸 계획 " 을 알린다.
엔진은 **호환 표 (LCM)**를 한 번만 조회해 허용/대기/거부를 즉시 결정한다.
이렇게 하면 테이블 전수락처럼 동시성이 무너지는 상황도 줄이고, 행 단위만 보다가 실패하는 후행 실패도 사라진다.

승격/업그레이드는 규율을 두어 메모리·경합을 통제하고, 공정한 대기 정책과 관측 지표로 예측가능한 성능을 유지한다.

Intent 핵심 원칙 요약표
원칙설명목적필요한 이유적용 포인트/예시
Protocol Ordering루트→리프 순서로 잠금상위서 조기 차단순환 대기·탐색 비용 방지테이블→페이지→행 순서 고정
Intention Declaration상위에 IS/IX/SIX 선언O(1) 선판정DDL·전수락과 즉시 충돌 판정테이블 IX 후 행 X
Compatibility-FirstLCM 먼저 조회후행 실패 제거하위 탐색·대기 낭비 방지요청 시 LCM 체크
Escalation/Upgrade승격·업그레이드 규율자원·경합 균형무질서 승격의 상위 충돌임계치 기반 승격
Fairness & Ordering공정 큐·일관 순서예측가능 성능기아·지연 폭증 방지FIFO+ 우선순위
Strictness for Recovery엄격 2PL 연계복구 단순화commit 전 X 유지로 안전장애 시 롤백 용이
Observability락/대기 가시화운영 의사결정교착·승격 폭주 조기 탐지잠금 뷰·지표 수집

핵심 원칙은 상위 선판정·질서·규율·가시성으로 정리된다. 이 조합이 동시성·정확성·예측성을 함께 만든다.

Intent 설계 철학 일람표
설계 철학설명목적필요한 이유실무 지침
최소 간섭필요한 최소 잠금만동시성 극대화불필요한 차단은 곧 지연단건 쓰기 범위만 잠금
계층적 질서상→하 일관 규칙경로 예측성무질서가 교착·탐색 유발리소스 순서 표준화
의도 명시IS/IX/SIX 신호화O(1) 판정상위에서 즉시 충돌 감지하위 접근 전 의도 잠금
성능 우선빠른 판정·해제지연 최소화락은 비용 요소테이블화/비트셋화
운영 친화모니터링·튜닝 용이안정적 운영문제 재현·완화 가능대기 큐·승격 지표 노출

설계 철학은 적게 잠그고, 위에서 갈라내고, 눈에 보이게 운용하는 데 초점을 둔다.

인텐트 잠금의 동작과 설계 통찰

운영 원리
  1. 의도 선언: 트랜잭션 T 는 대상 테이블에 IS/IX/SIX로 의도를 표시한다.
  2. 호환성 검사: 락 매니저는 상단 매트릭스로 즉시 충돌 여부 판단 (예: IX↔S는 불가).
  3. 실락 부여: 허용되면 필요한 범위의 S/X를 하위 (페이지/레코드) 에만 부여한다.
  4. 작업 수행: 읽기는 S 기반, 갱신은 X 기반으로 진행.
  5. 에스컬레이션 (선택적): 하위 락이 과도하면 상위 (테이블) 로 승격해 락 수를 줄인다.
  6. 해제: 레코드→페이지→테이블 순으로 해제한다.
  7. SIX 의 활용: 전체를 읽으면서 (S) 일부만 갱신 (하위 X) 하는 혼합 워크로드를 한 트랜잭션에서 안전하게 처리.
인텐트 모드 동작 과정 예시 (IX)
sequenceDiagram
    participant T as Transaction
    participant LM as Lock Manager
    participant DB as Database
    participant TB as Table
    participant PG as Page
    participant RC as Record
    
    T->>LM: Request IX on Database
    LM->>DB: Grant IX Lock
    T->>LM: Request IX on Table
    LM->>TB: Grant IX Lock  
    T->>LM: Request X on Record
    LM->>RC: Grant X Lock
    T->>RC: Update Record
    T->>LM: Release X on Record
    T->>LM: Release IX on Table
    T->>LM: Release IX on Database

주요 단계:

  1. 의도 선언: 상위 레벨에 인텐트 잠금 요청
  2. 호환성 검사: 기존 잠금과의 충돌 여부 확인
  3. 잠금 획득: 호환 가능시 잠금 부여
  4. 실제 작업: 하위 레벨에서 데이터 조작
  5. 잠금 해제: 하위에서 상위 순으로 해제
핵심 메커니즘

호환성 (테이블 레벨):

보유 \ 요청ISIXSSIXX
IS
IX
S
SIX
X

선행 요건 (부모 락):

인텐트 잠금 모드·호환성 한눈표
구분의미주 사용 시나리오부모 필요 잠금대표 비호환
IS하위에 S 예정범용 읽기(상위) IS/IXX
IX하위에 X 예정선택적 갱신(상위) IX/SIXS, SIX, X
SIX상위 S + 일부 하위 X대량 읽기 + 부분 갱신(상위) SIXIS 외 전부
S공유 읽기테이블 단위 읽기(부모) IS/IXIX, SIX, X
X배타 갱신테이블 전량 갱신(부모) IX/SIX전부
인텐트 잠금 처리 플로우
flowchart TD
  A[트랜잭션 시작] --> B["상위 객체에 Intent 요청(IS/IX/SIX)"]
  B --> C{호환성 검사}
  C -->|허용| D[하위에 실제 S/X 락 획득]
  C -->|거부| E{대기 가능?}
  E -->|예| F[대기 큐 진입] --> G{데드락 감지?}
  G -->|예| H[롤백 및 재시도/중단]
  G -->|아니오| C
  E -->|아니오| H
  D --> I{"하위 락 과도? (에스컬레이션)"}
  I -->|예| J[상위 락으로 승격 시도] --> C
  I -->|아니오| K["업무 로직 수행(읽기/갱신)"]
  K --> L["락 해제(하위→상위)"]
  L --> M[트랜잭션 종료]

IS/IX/SIX 의미와 상위→하위 획득 순서

왜 의도 락을 먼저 거나?
각 모드의 의미·사용 시점

팁: SIX 는 ’ 스캔 + 부분 갱신 ’ 에 특화. 상위 충돌 가능성이 있으니 남발하지 말고 명확한 패턴에서만 사용.

상위→하위 획득 순서 (알고리즘)
  1. 대상 계층을 위에서 아래로 나눈다: 데이터베이스/스키마 → 테이블/파티션 → 페이지 → 행 (→ 인덱스 키)
  2. 트랜잭션 의도를 결정한다: 읽기만 (S) / 쓰기 (X) / 스캔 + 부분 갱신 (S + 일부 X)
  3. 상위 노드에 의도 락을 건다:
    • 읽기: IS
    • 쓰기: IX
    • 스캔 + 부분 갱신: SIX
  4. 하위 노드에서 실제 락을 건다:
    • 읽기 대상: S
    • 갱신 대상: X
  5. 2PL(두 단계 잠금) 기준: 확장 단계 (획득만) → 수축 단계 (해제만). 커밋/롤백 시 일괄 해제.
연습

의도 모드의 흐름과 생명주기 전모

의도 모드는 " 행/키에 걸 락의 계획 " 을 테이블 같은 상위 레벨에 먼저 알리는 절차다.
엔진은 이 신호를 보고 즉시 호환 여부를 판단한다. 불가하면 대기 큐로 보내고, 가능하면 락을 부여한 뒤 하위 실제 락으로 내려간다.
작업이 끝나면 하위부터 상위 순서로 풀어 주고, 그때 대기 중인 트랜잭션을 깨워 다음 결정을 진행한다.
중간에 데드락·타임아웃·에스컬레이션·업그레이드 같은 예외 경로가 개입할 수 있다.

의도 모드 데이터·제어 흐름 정리
  1. 요청 (Request): 트랜잭션이 상위 객체에 IS/IX/SIX 요청
  2. 호환 판정 (LCM): 보유 vs 요청을 표로 즉시 판정
  3. 대기 (Queue): 불가 시 대기 큐로 진입, 주기적 재평가/데드락 탐지/타임아웃
  4. 부여 (Grant): 가능 시 의도 락 부여→하위 실제 S/X(또는 범위락) 요청/부여
  5. 유지 (Hold): 작업 수행, 필요 시 에스컬레이션·업그레이드 시도 (정책 준수)
  6. 해제 (Release): 커밋/롤백에서 하위→상위 순으로 해제, 대기자 깨우기 (Grant 재시도)
의도 모드 제어 단계 요약
의도 모드 흐름 한눈 요약
단계입력핵심 결정 (판정)수행 액션산출/아티팩트관측 지표
요청트랜잭션 T, IS/IX/SIX상위 LCM 호환 여부의도 락 신청요청 이벤트요청률, 큐 길이
대기불호환FIFO/우선순위/에이징큐 대기, 주기 재평가대기 엔트리평균/백분위 대기
부여호환그랜트 시점 결정의도 락 부여그랜트 로그그랜트 레이트
하위락하위 S/X/범위락하위 LCM 판정하위락 부여잠금 핸들레코드 잠금 수
유지작업 진행에스컬레이션/업그레이드 필요승격/변환 시도정책 이벤트에스컬레이션 횟수
해제커밋/롤백하위→상위 순 해제대기자 깨우기해제 로그데드락/타임아웃 수

요약: 상위에서 의도 신호로 빠르게 판정하고, 불가 시 대기·재평가한다. 가능 시 하위 락으로 내려가 작업을 수행하고, 커밋에서 하위→상위 해제하며 대기자를 깨운다. 예외 경로는 데드락/타임아웃/에스컬레이션/업그레이드다.

의도 모드 제어 플로우차트
flowchart TD
    A[트랜잭션 시작] --> B[상위 객체에 IS/IX/SIX 요청]
    B --> C{LCM 호환?}
    C -- 예 --> D[의도 락 Grant]
    C -- 아니오 --> E[대기 큐 등록]
    E --> F{데드락/타임아웃?}
    F -- 예 --> G[희생자 선택·롤백]
    F -- 아니오 --> C

    D --> H[하위 S/X/범위락 요청]
    H --> I{하위 LCM 호환?}
    I -- 예 --> J[하위 락 Grant·작업 수행]
    I -- 아니오 --> K[하위 대기 큐 등록]
    K --> L{데드락/타임아웃?}
    L -- 예 --> G
    L -- 아니오 --> I

    J --> M{에스컬레이션 필요?}
    M -- 예 --> N[상위 락 승격 시도]
    N --> O{호환·성공?}
    O -- 예 --> J
    O -- 아니오 --> K

    J --> P{"업그레이드 필요?(S→X)"}
    P -- 예 --> Q{즉시 가능?}
    Q -- 예 --> J
    Q -- 아니오 --> K

    J --> R[커밋/롤백]
    R --> S[하위→상위 순으로 해제]
    S --> T[대기자 깨우기·Grant 재평가]
    T --> U[종료]

상위 의도 락에서 첫 판정을 수행해 대기를 최소화하고, 하위 실제 락에서 두 번째 판정이 이뤄진다. 대기 중에는 데드락/타임아웃을 감시한다. 유지 단계에서 에스컬레이션·업그레이드를 정책적으로 시도하며, 커밋 시 하위→상위 해제와 깨우기로 다음 결정을 트리거한다.

의도·실제 락 생명주기 확장
stateDiagram-v2
    [*] --> Requested
    Requested --> Waiting: 호환 불가
    Requested --> Granted: 호환 가능
    Waiting --> Aborted: 데드락/타임아웃
    Waiting --> Granted: 충돌 해소
    Granted --> Upgrading: S→X 등 변환 시도
    Upgrading --> Granted: 성공
    Upgrading --> Waiting: 충돌 발생
    Granted --> Escalating: 상위 락 승격 시도
    Escalating --> Granted: 성공(승격됨)
    Escalating --> Waiting: 충돌 발생
    Granted --> Released: 커밋/롤백
    Aborted --> Released
    Released --> [*]

설명: 기본 4 단계 (Requested→Waiting→Granted→Released) 에 Aborted(데드락/타임아웃), Upgrading(업그레이드), **Escalating(승격)**을 추가해 실무 예외 흐름을 반영했다.

특성 분석 및 평가

의도 잠금의 가치와 실전 효과

Intent Modes 는 상위에서 " 잠글 계획 " 을 먼저 알리는 신호다. 덕분에 엔진은 호환성 매트릭스 한 번으로 충돌을 즉시 판정하고, 하위 전체를 뒤지지 않아도 된다. 그 결과 동시성이 올라가고, Top-down 획득 규율데드락이 줄며, 에스컬레이션·모니터링과 맞물려 관리 효율과 확장성이 높아진다. 마지막으로 Intent 는 규칙 (매트릭스), 2PL·격리수준은 절차 (프로토콜) 로 협업해 무결성과 예측 가능성을 보장한다.

Intent Modes 장점 일람표
장점상세 설명기술 근거 (메커니즘)주요 적용 상황실무적 가치주의/한계
효율적 충돌 검사상위 Intent 만 보고 허용/대기 즉시 판정호환성 매트릭스 O(1) 판정대용량 스캔 vs 단건 갱신 혼재응답 지연·CPU 감소Intent 만으론 실제 데이터 충돌 미해결
동시성 극대화광역 잠금 회피, 세밀 단위 병행IS/IX/SIX + 세밀 그라뉼러리티OLTP 다중 사용자TPS↑, 장기대기↓인덱스·쿼리 품질에 의존
데드락 완화자원 할당 방향 통일Top-down 획득 규칙혼합 트랜잭션 (DDL/배치 포함)롤백/타임아웃 감소잘못된 락 순서 땐 여전히 발생
관리 효율/확장성락 수 요약·승격 용이에스컬레이션 정책과 결합대형 테이블·배치 처리메모리·락 테이블 부하↓과도 승격 시 동시성 저하 가능
일관성/무결성규칙 + 프로토콜 결합매트릭스 + 2PL/격리수준금융/주문/결제예측 가능한 일관성격리수준·범위락 설정 필요
운영 가시성상·하위 경합을 신호로 노출Intent 상태 관측모니터링/트러블슈팅진단·복구 시간 단축관측 체계 미흡 시 효과 제한

의도락은 상위 신호로 빠르게 차단, 세밀 잠금으로 병행성 확대, Top-down 규율로 교착 완화를 달성하며, 에스컬레이션·모니터링과 결합될 때 운영 효율과 일관성이 극대화된다.

의도 잠금의 리스크와 운영 대응 전략

의도 잠금의 단점과 완화·대안
단점설명원인실무 문제완화/해결 방안대안 기술
추가 락 획득 비용IS/IX 선행으로 락 수 증가위계 의도 신호획득 지연·락 테이블 팽창임계 조정, 트랜잭션 단축, 오프피크 배치MVCC·샤딩
메모리/메타락 오버헤드잠금 메타데이터 유지비계층별 상태 저장메모리 압박에스컬레이션·풀링·TTLCQRS·캐시
구현·운용 복잡성매트릭스·프로토콜 지식 필요다중 모드 상호작용버그·튜닝 난도↑표준 가이드·관측 자동화단순 S/X+ 낙관적 재시도
에스컬레이션 부작용승격 시 차단 폭 확대임계 초과·보호 정책p95↑, 처리량 출렁임파티션 승격, 시간대 분리배치·큐잉
오판/과도 차단상위 호환만 보고 보수화넓은 테이블/범위 락불필요 대기인덱스·쿼리 재작성, 범위 세분화파티셔닝
업그레이드/특수 락 충돌S→X, 갭락 등 상호작용순서 불일치·핫스팟데드락·재시도↑순서 고정, 처음부터 X, SKIP LOCKED멱등·큐 기반 직렬화

요약: 의도 잠금의 비용은 정책·설계로 줄이고, 남는 리스크는 MVCC/샤딩/큐잉 등과의 보완 조합으로 처리한다.

의도 잠금 운용의 제약과 대응
제약사항설명원인영향해결 방안대안 기술
엔진 의존성/관측 차모드·뷰·이벤트 상이내부 설계 차이표준화 어려움엔진별 가이드·추상화공통 락 어댑터
계층 구조 의존트리형 전제의도 잠금 본질비계층 데이터 어려움가상 계층 도입문서/키 - 값 락
획득 순서 제약루트→리프 강제프로토콜 정합코드 실수 리스크자동 락 매니저·리뷰낙관적 재시도
분산 환경 한계단일 노드 가정네트워크/분할글로벌 성능·일관성 저하분산 락·2PC·합의리더 단일화·사가
스키마/인덱스 품질 의존선택도 낮음 시 차단↑설계 부실p95↑·스루풋↓인덱스 재설계·통계 갱신CQRS/캐시
긴 트랜잭션 취약보유 시간 길어짐긴 처리 흐름데드락·대기↑분할·타임아웃비동기 보상

요약: 제약은 환경·엔진·데이터 모델에서 오며, 추상화·설계 보완·분산 프로토콜 결합으로 관리한다.

의도 락 트레이드오프의 실전 해법

의도 락은 " 하위에서 어떤 잠금을 쓸지 " 를 상위에 먼저 알리는 방식이다. 세밀하게 잠그면 동시성은 오르지만 관리가 어려워진다. 그래서 상위에 IS/IX/SIX 로 의도를 밝히고, 필요한 곳만 실제 S/X 로 잠근다. 읽기는 버전닝으로 가볍게, 범위 정확성은 키 - 범위로 보강하고, 미세 락이 많아지면 적절히 상위로 올려 균형을 맞춘다.

의도 락 트레이드오프 선택 매트릭스
트레이드오프A 선택A 장점A 단점/위험B 선택B 장점B 단점/위험고려 기준 (결정 포인트)연관 의도 락/정책
동시성 vs 오버헤드세밀 락 (행/키)대기↓, 충돌 격리↑락 수↑, 메타데이터 비용↑거친 락 (페이지/테이블)관리 단순, 메모리 절약대기↑, 병렬성↓평균/P95 대기, 락 수, 메모리 여유IS/IX 표준화, 에스컬레이션 임계
복잡성 vs 성능SIX 적극 사용범위 스캔 + 부분 갱신 최적상위 충돌·관리 복잡도IS/IX 만 사용규칙 단순스캔 중 갱신 충돌 위험부분 갱신 비율, 스캔 카디널리티SIX + 하위 X 패턴
메모리 vs 응답시간캐싱/긴 보유재획득↓, 응답 안정메모리 점유↑필요시 생성/짧은 보유메모리 절약재획득 비용, 지연 변동락 재사용율, 힙/버퍼 압력타임아웃·재시도·보유 시간 상한
일관성 vs 확장성키 - 범위/직렬화팬텀 방지, 강한 무결성지연↑, 스루풋↓버전닝 (읽기)대기↓, 처리량↑범위 무결성 미보장범위 민감 경로 비중, SLO키 - 범위는 핵심 경로만, 나머지 버전닝
단일 정책 vs 맥락별단일 전사 정책운영 단순, 예측 쉬움비효율적 상황 발생테이블/파티션별 정책최적화 여지↑운영 복잡, 룰 관리 부담Hot/Cold 분류, 서비스 레벨파티션별 IS/IX/SIX·임계 분리
낙관적 vs 비관적낙관적 (OCC) 혼용대기 없음, 확장↑충돌 시 재시도 비용비관적 (2PL)안정성·예측↑대기·교착 가능충돌율·재시도 비용, SLAOCC(핫 샤드) + 2PL(코어)

" 필요한 곳만 강하게, 나머지는 가볍게 " 가 공통 원칙이다. 범위 정확성이 핵심인 경로는 키 - 범위/직렬화로, 읽기 우세 구간은 버전닝으로, 부분 갱신 패턴은 SIX 로, 운영 복잡도는 임계·룰 자동화로 줄인다.

하이브리드 패턴과 적용 목적
하이브리드구성 요소적용 목적 (해결 트레이드오프)장점고려사항
SIX + 하위 X상위 SIX, 대상 행 X동시성 vs 복잡성스캔 병렬성 유지, 수정만 배타상위 충돌 증가 가능, 후보 식별 인덱스 필요
버전닝 + IX/X읽기 버전닝, 쓰기 IX/X일관성 vs 확장성읽기 대기 제거, 쓰기 안전읽기 - 쓰기 간 갭은 애플 설계로 보완
선택적 키 - 범위핵심 인덱스만 키 - 범위일관성 vs 성능팬텀 제거, 비용 최소화범위 정의 정확성, 인덱스 설계 중요
동적 에스컬레이션임계/예외/시간대 기반 승격메모리 vs 응답메모리 보호, 야간 배치 최적낮 시간 동시성 저하 위험
파티션별 정책Hot/Cold 분리, 임계 차등단일정책 vs 맥락별핫셋 특화, 콜드셋 단순정책 관리/관측 복잡
OCC + 2PL 혼합핫 샤드 OCC, 코어 2PL낙관적 vs 비관적확장·예측성 동시 확보충돌율/재시도 비용 추적 필요
우선순위 대기대기 큐 가중치/나이동시성 vs SLO긴급 트랜잭션 보호공평성·기아 방지 설계

하이브리드는 " 경로·시간·데이터 특성 " 에 따라 강도와 비용을 달리 배치해 총비용을 최솟값으로 맞춘다.

Intent 적용 결정의 핵심 판단축

Intent Modes 는 상위에서 거르고 하위에서 확정하는 방식이어서, 경합이 높거나 스캔·DDL 이 섞인 OLTP에서 특히 효과적이다.
상위 (테이블 등) 에 IS/IX/SIX 신호를 먼저 세워두면, 엔진은 호환성 표로 즉시 허용/대기를 판단해 불필요한 하위 탐색을 줄인다.
반대로 단순 읽기 중심이나 초저지연 목표의 시스템에선 추가 오버헤드가 이득을 상쇄할 수 있다.
운영 단계에서는 에스컬레이션 임계·대기 큐 정책·관측 지표를 함께 설계해야 예측 가능한 성능을 얻을 수 있다.

Intent Modes 적용 적합성 진단
설계 관점
분석 관점
운영 관점
Intent 적용 환경별 판정표
분류대표 환경/조건판정이유권장 설정/보완책주요 리스크
OLTP 고경합동일 테이블에 잦은 쓰기적합상위 조기 차단으로 하위 대기/탐색↓IX 선점, 에스컬레이션 임계 튜닝승격 과다로 상위 충돌
배치·스캔 혼재대량 스캔 + 동시 DML적합범위 락 + 의도락으로 간섭 예측키 - 범위/넥스트키 활성, 인덱스 보강팬텀·긴 대기
DDL 빈발스키마 변경 잦음적합DDL 과 즉시 충돌 노출변경 윈도우 운영, 락 타임아웃 설정대량 대기/교착
읽기 중심캐시 히트↑, 쓰기 희소조건부이득 < 관리비용 가능의도락 최소화, RC 활용불필요한 오버헤드
초저지연마이크로초 지연 목표부적합락 경로 자체가 지연 임계 초과락리스/낙관적 기법 대체지연 편차 확대
임베디드 제약메모리/CPU 제한부적합락 테이블/큐 비용 부담간소화된 락 또는 단일 그레인OOM/스톨 위험

경합·혼재·DDL 이 많을수록 Intent 의 상위 선판정 이득이 커진다. 반면 읽기 편중·초저지연·자원 제약 환경에서는 운영 비용이 이득을 상회할 수 있어 대체 전략을 우선 검토한다.

Phase 4: 구현 방법 및 분류

인텐트 락 구현의 체계와 실전 운용

인텐트 락 구현 핵심 기법 정리
구현 기법정의특징목적주 사용 상황대표 예시
인텐트 락 (IS/IX/…)상위에 의도 신호상수시간 호환성·MGL충돌 빠른 판정다층 객체 운영FOR UPDATE → IX+X
SIX 운용상위 S + 일부 X혼합 워크로드 적합읽기 동시성 + 부분 갱신리포트 + 보정SQL Server/Db2 SIX
호환성 매트릭스모드 간 호환 표IX↔S 충돌, X 전부 충돌큐/스케줄 효율고경합 테이블엔진 내부 테이블
획득·해제 프로토콜상→하 획득/하→상 해제부모 선행 요건일관성·교착 예방전 트랜잭션 공통레코드→페이지→테이블 해제
락 에스컬레이션하위→상위 승격락 엔트리 수↓관리비용 절감배치·대량 처리임계치 기반 승격
SQL- 엔진 맵핑구문→락 패턴자동 설정개발 단순화일반 DML/DDLREAD(S), WRITE(X)
인텐트 락 구현의 3 축 분류
엔진 - 중립 설계 기법

엔진 - 중립 설계 요소

요소설계 포인트실패 시 처리
인텐트 락상→하 단계별 부여상위 실패 시 하위 롤백
호환성 매트릭스대칭·완전성즉시 거부/대기 큐
2PL 프로토콜획득/해제 순서 고정역순 해제 강제
엔진 - 특화 운용 기법

벤더별 차이 (요지)

엔진인텐트 모드SIX특징
SQL ServerIS/IX/SIX 등 다양지원풍부한 모드·모니터링 뷰
Db2/InformixIS/IX/SIX지원전통적 MGL 구현
MySQL InnoDBIS/IX 중심일반적 비노출단순·명확 (테이블 X 강력)
PostgreSQL(인텐트 개념 無)해당 없음MVCC+ 테이블 락 모드
SQL·운영 튜닝 기법

운영 튜닝 체크리스트

항목점검 포인트액션
맵핑 확인구문별 의도/실락 일치성실행계획·락 뷰 확인
에스컬레이션임계치·파티션 고려테이블/파티션 기준 설정
대기·데드락대기 그래프/타임아웃재시도·순서 정렬·락 범위 축소
인텐트 락 구현·운영 한눈에 보기
카테고리기법/요소정의·핵심목적대표 상황주의/팁
A(설계)인텐트 락 (IS/IX)상위에 의도 신호충돌 즉시 판정다층 객체상→하 획득
A(설계)호환성 매트릭스모드 간 호환 표큐 효율화고경합대칭·완전성 유지
A(설계)2PL 프로토콜상→하 획득/하→상 해제교착·불일치 방지전 구간역순 해제 강제
B(특화)SIX 운용상위 S + 일부 X혼합 워크로드리포트 + 보정벤더 의존
B(특화)벤더 차이모드·정책 차이적합성 확보이식성 고려문서 확인
C(운영)SQL- 락 맵핑구문→락 패턴개발 단순화일반 DML실행계획·락뷰 확인
C(운영)에스컬레이션하위→상위 승격비용 절감배치임계치 튜닝
C(운영)대기/데드락큐·타임아웃·감지장기 대기 방지고경합재시도·순서 정렬

의도 모드 선택을 위한 네 가지 축

의도 모드는 " 하위에서 잡을 S/X 잠금 계획 " 을 상위에 미리 알리는 표기다.
유형을 고를 때는 네 가지를 본다.
어디를 보호할지 (테이블/페이지/행), 어떤 조합이 필요한지 (IS/IX/SIX), 어떻게 적용할지 (정적/동적/적응), 워크로드가 무엇인지 (읽기·갱신·혼합).
이 네 축을 맞추면 LCM 으로 허용/대기가 즉시 결정되고, 동시성과 안정성을 함께 얻는다.

의도 모드 분류의 표준 프레임

분류 기준유형핵심 의미상→하 매핑 예장점/주의대표 상황
리소스 계층 (세밀도)테이블상위에서 의도 표기Table: IS/IX/SIX → Row: S/X관리 쉬움/동시성 낮음배치, 야간 스캔
페이지/블록중간 단위 보호Table: IS/IX → Page: S/X균형형 성능일반 OLTP
행/키 범위미세 단위 보호Table: IS/IX/SIX → Row/Key: S/X/범위동시성↑/락 수↑실시간 거래
모드 조합 (복잡성)기본IS·IXIS→S, IX→X단순·예측 용이소규모/단순 트랜잭션
확장SIX 포함SIX(상위 S + 하위 X 일부)혼합 워크로드 최적엔터프라이즈
사용자정의제품/도메인 특화정책 룰 기반관리 복잡성↑특수 워크로드
구현 방식정적컴파일/설계 시 고정파라미터 고정일관성↑/유연성↓레거시 마이그레이션
동적런타임 선택힌트/옵션 반영적응력↑변동 워크로드
적응관측 기반 자동화지표 기반 변경자동 최적화클라우드 네이티브

의도 모드 실무형 4 축 분류

리소스 계층 (세밀도)

상위일수록 관리가 쉽고 동시성이 낮다. 행/키로 세밀해질수록 동시성이 높지만 락 수가 증가한다.
의도 모드는 항상 상→하로 부여되며, 하위에서의 S/X 허용은 상위 의도로 빠르게 판정된다.

계층상위 의도하위 실제장점주의
테이블IS/IX/SIXRow/Key: S/X관리 단순과도하면 동시성 저하
페이지IS/IXPage: S/X균형형페이지 경합 주의
행/키IS/IX/SIXRow/Key/Range: S/X동시성↑락 수/메모리↑

요약: 세밀도 선택은 동시성과 운영 비용의 트레이드오프다. 배치는 상위, 실시간 갱신은 하위가 유리.

모드 조합 (복잡성)

IS 는 읽기 의도, IX 는 쓰기 의도, SIX 는 " 전체 읽기 + 부분 쓰기 " 를 한 번에 표현한다.
SIX 는 혼합 워크로드에서 테이블 스캔과 부분 갱신을 안전하게 공존시킨다.

유형의미상→하 예장점주의
기본 (IS·IX)단일 의도IS→S, IX→X단순혼합에 비효율적
확장 (SIX)혼합 의도SIX + 일부 X혼합 최적호환성 제약↑
사용자정의정책 기반제품별특화 대응복잡성↑

요약: 혼합 워크로드면 SIX 를 우선 검토하고, 단일 목적이면 IS 또는 IX 로 단순화한다.

구현 방식

정적은 규칙이 고정돼 예측 가능하지만 변화에 약하다.
동적은 런타임 힌트/옵션으로 조절한다.
적응은 관측 지표로 모드/세밀도를 자동 조정한다.

방식결정 시점장점주의적합 시나리오
정적설계·배포 시일관성유연성↓레거시, 규제가 강한 환경
동적런타임적응력관리비용변동 워크로드
적응관측 자동자동 최적검증 필요클라우드 네이티브

요약: 변동성이 크면 동적/적응, 규칙성이 높으면 정적이 적합하다.

워크로드 패턴

읽기 중심은 IS+S 로 동시성을 극대화한다.
갱신 중심은 IX+X 로 충돌을 조기 차단한다.
혼합은 SIX 로 스캔과 부분 갱신을 엮는다.

패턴상위 의도하위 실제이점주의
읽기 중심ISS동시성↑팬텀 대비 필요 (범위락)
갱신 중심IXX정합성↑대기 증가 가능
혼합SIXS + 일부 X균형호환성 제약 관리

요약: 패턴에 맞춘 의도 선택이 대기/데드락/팬텀 위험을 가른다.

의도 모드 분류 종합 매트릭스

유형상위 의도하위 실제주된 이점주의 포인트대표 상황
세밀도테이블/페이지/행·키IS/IX/SIXS/X/Range관리 단순↔동시성↑락 수·메모리/경합배치/OLTP/실시간
모드 조합기본/확장/사용자정의IS·IX·SIXS/X목적 적합성호환성·복잡성단일/혼합 트랜잭션
구현정적/동적/적응정책/힌트/자동동일예측↔적응운영비용·검증레거시/클라우드
워크로드읽기/갱신/혼합IS/IX/SIXS/X/혼합성능·정합성 균형팬텀/대기/교착분석/OLTP/HTAP

Intent 생태계의 구현·제어·운영 지도

Intent Modes 는 엔진 내부에서 자동으로 작동하고, ORM/프레임워크는 이를 유발하는 SQL 힌트·격리 옵션을 제공한다. 실무에선 (1) 엔진 뷰/이벤트로 현재 보유/대기/리드 블로커를 관측해 병목을 찾고, (2) 서비스 코드에서 락 힌트·격리수준을 일관되게 지정하며, (3) 에스컬레이션/범위잠금/DDL 보호를 이해해 대규모 작업과 미세 갱신이 충돌하지 않도록 조합한다. PostgreSQL 은 명시적 IS/IX 가 없지만 테이블 락 모드와 MVCC 로 유사 목적을 달성하고, MySQL/SQL Server/Oracle 은 의도 또는 동등 개념을 통해 상위 신호 → 하위 실제 잠금을 구현한다.

Intent 생태계: 엔진·ORM·운영

DBMS 내장 (의도락 구현·관측)
애플리케이션/ORM 계층 (락 힌트·격리 노출)
운영·모니터링 (진단·튜닝)

Intent 도구 분류: 구현·제어·운영

구현/관측 (Engine)
제품/엔진의도/동등 모드관측 수단특징적 용도강점약점
MySQL InnoDBIS/IX + 넥스트키/갭Performance Schema, MDL팬텀 방지·DDL 보호범위 제어 명확에스컬레이션 부재, 인덱스 민감
SQL ServerIS/IX/SIX + 에스컬레이션DMV, XE혼합 워크로드정책 성숙·XE과도 승격 리스크
OracleRS/RX/S/SRX/X + MVCCV$ 뷰/AWR/ASH읽기 일관성강력한 도구학습 곡선 큼
PostgreSQL(의도 없음) 테이블 락 + MVCCpg_locks 등비블로킹 읽기단순 관측정통 Intent 부재
제어 (Application/ORM)
프레임워크핵심 기능역할용도강점약점
Hibernate/JPA@Lock(…)행/쿼리 잠금비관/낙관 선택선언적DB 별 의미 차이
Spring@Transactional격리/전파/타임아웃서비스 계층 제어일관 정책엔진 의존
SQLAlchemy.with_for_update()행 잠금갱신 경합SQL 직관조인/범위 주의
Django ORM.select_for_update()행 잠금크리티컬 섹션간결트랜잭션 관리 필요
EF Core낙관 컨커런시충돌 감지재시도 패턴재시도 용이비관 잠금 한계
운영/모니터링 (Ops)
제품/도구기능역할용도강점약점
PostgreSQL 뷰/로그pg_locks, pg_stat_activity, 대기 로그블로킹/대기 파악운영/장애 분석즉시성상관분석 필요
MySQL PS/상태data_locks, data_lock_waits, 엔진 상태범위/대기 분석팬텀/갭 이슈세밀설정·학습 필요
SQL Server DMV/XEsys.dm_tran_locks, XE이벤트 추적프로덕션 모니터링저오버헤드세션 설계 필요
Oracle 뷰/리포트V$LOCK/SESSION, AWR/ASH추세/실시간 병행용량·장애 분석강력비용/복잡성

Intent 도구·프레임워크 통합표

카테고리제품/도구의도/동등 모드·기능관측/제어 수단주요 용도강점약점
구현/관측MySQL InnoDBIS/IX, 넥스트키/갭, MDLPerformance Schema팬텀 방지·DDL 보호범위 제어 명확에스컬레이션 부재
SQL ServerIS/IX/SIX, 에스컬레이션DMV, XE혼합 워크로드정책 성숙·XE승격 오조정 리스크
OracleRS/RX/S/SRX/X, MVCCV$ 뷰/AWR/ASH일관성·고부하도구 강력학습 곡선 큼
PostgreSQL(의도 無) 테이블 락 +MVCCpg_locks 등비블로킹 읽기단순 관측정통 Intent 부재
제어Hibernate/JPA@Lock(…)어노테이션비관/낙관 선택선언적이식성 검증 필요
Spring@Transactional설정/코드격리/전파/타임아웃일관성엔진 의존
SQLAlchemy.with_for_update()메서드행 잠금직관범위 주의
Django.select_for_update()메서드행 잠금간결트랜잭션 관리 필요
EF Core낙관 컨커런시속성/미들웨어재시도충돌 처리 용이비관 잠금 제약
운영PostgreSQL뷰/로그쿼리/로그블로킹·대기즉시성상관분석 필요
MySQLPS/상태뷰/명령범위/대기세밀설정 필요
SQL ServerDMV/XE뷰/세션이벤트저오버헤드설계 필요
OracleV$·AWR/ASH뷰/리포트트렌드·실시간강력비용/복잡성

실무 적용 및 사례

실습 예제 및 코드 구현

실습 예제: MySQL 에서 Intent Lock 실습
목적
사전 요구사항
단계별 구현
  1. IS-Lock 실습 (SELECT FOR SHARE)

    1
    2
    3
    4
    
    -- 세션1
    START TRANSACTION;
    SELECT * FROM student WHERE id = 1 FOR SHARE;
    -- 내부적으로 테이블에 IS-Lock, 행에 S-Lock이 걸림
    
  2. IX-Lock 실습 (UPDATE)

    1
    2
    3
    4
    
    -- 세션2
    START TRANSACTION;
    UPDATE student SET name = 'kim' WHERE id = 1;
    -- 테이블에 IX-Lock, 행에 X-Lock이 걸림
    
  3. 경합 및 대기 확인

    1
    2
    
    -- 세션1에서 트랜잭션 유지
    -- 세션2에서 동일 행 UPDATE 시 대기 발생, 트랜잭션 충돌 실습
    
실행 결과
추가 실험
실습 예제: 계층적 인텐트 잠금 시뮬레이션
목적
사전 요구사항
단계별 구현
  1. 1 단계: 리소스 계층 구조 정의

     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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    
    from typing import Dict, List, Set, Optional
    from enum import Enum
    from dataclasses import dataclass
    import threading
    import time
    from concurrent.futures import ThreadPoolExecutor
    
    @dataclass
    class ResourceNode:
        """계층적 리소스 노드"""
        name: str
        level: int  # 0=데이터베이스, 1=테이블, 2=페이지, 3=레코드
        parent: Optional['ResourceNode'] = None
        children: List['ResourceNode'] = None
    
        def __post_init__(self):
            if self.children is None:
                self.children = []
    
        def get_path(self) -> List[str]:
            """루트부터 현재 노드까지의 경로 반환"""
            path = []
            node = self
            while node:
                path.insert(0, node.name)
                node = node.parent
            return path
    
    # 샘플 계층 구조 생성
    def create_sample_hierarchy():
        """실습용 데이터베이스 계층 구조 생성"""
        # 데이터베이스 레벨
        db = ResourceNode("ecommerce_db", 0)
    
        # 테이블 레벨
        users_table = ResourceNode("users", 1, db)
        orders_table = ResourceNode("orders", 1, db)
    
        # 페이지 레벨  
        users_page1 = ResourceNode("users_page_1", 2, users_table)
        users_page2 = ResourceNode("users_page_2", 2, users_table)
        orders_page1 = ResourceNode("orders_page_1", 2, orders_table)
    
        # 레코드 레벨
        user_1001 = ResourceNode("user_1001", 3, users_page1)
        user_1002 = ResourceNode("user_1002", 3, users_page1)
        order_2001 = ResourceNode("order_2001", 3, orders_page1)
    
        # 부모-자식 관계 설정
        db.children = [users_table, orders_table]
        users_table.children = [users_page1, users_page2]
        orders_table.children = [orders_page1]
        users_page1.children = [user_1001, user_1002]
        orders_page1.children = [order_2001]
    
        return db, {
            'user_1001': user_1001,
            'user_1002': user_1002, 
            'order_2001': order_2001,
            'users_page_1': users_page1,
            'orders_page_1': orders_page1
        }
    
  2. 2 단계: 고급 잠금 관리자 구현

      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
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    
    class EnhancedLockManager:
        """실습용 고급 잠금 관리자 - 교착상태 검출 및 통계 포함"""
    
        def __init__(self):
            self.compatibility_matrix = {
                'IS': {'IS', 'IX', 'S', 'SIX'},
                'IX': {'IS', 'IX'},
                'S': {'IS', 'S'},
                'SIX': {'IS'},
                'X': set()
            }
    
            # 핵심 데이터 구조
            self.lock_table: Dict[str, Dict[str, str]] = {}  # resource_path -> {txn_id -> mode}
            self.wait_queue: Dict[str, List[tuple]] = {}     # resource_path -> [(txn_id, mode, timestamp)]
            self.transaction_locks: Dict[str, List[str]] = {}  # txn_id -> [resource_paths]
    
            # 통계 정보
            self.stats = {
                'locks_granted': 0,
                'locks_waited': 0,
                'deadlocks_detected': 0,
                'avg_wait_time': 0.0
            }
    
            self._lock = threading.RLock()
    
        def acquire_hierarchical_lock(self, transaction_id: str, resource_node: ResourceNode, 
                                    mode: str) -> tuple[bool, str]:
            """계층적 잠금 획득 - 실습에서 핵심 메소드"""
            path = resource_node.get_path()
            acquired_resources = []
    
            with self._lock:
                try:
                    # 1. 루트부터 타겟까지 순차적 잠금 획득
                    for i, resource_name in enumerate(path):
                        resource_path = '/'.join(path[:i+1])
    
                        # 인텐트 모드 결정 (중간 노드) vs 실제 모드 (리프 노드)
                        if i < len(path) - 1:
                            # 중간 노드: 인텐트 모드 적용
                            intent_mode = self._get_intent_mode(mode)
                            success, wait_reason = self._try_acquire_single(
                                transaction_id, resource_path, intent_mode
                            )
                        else:
                            # 리프 노드: 실제 요청된 모드 적용
                            success, wait_reason = self._try_acquire_single(
                                transaction_id, resource_path, mode
                            )
    
                        if not success:
                            # 실패 시 이미 획득한 잠금들 해제
                            self._rollback_acquired_locks(transaction_id, acquired_resources)
                            return False, wait_reason
    
                        acquired_resources.append(resource_path)
    
                    # 2. 트랜잭션별 잠금 목록 업데이트
                    if transaction_id not in self.transaction_locks:
                        self.transaction_locks[transaction_id] = []
                    self.transaction_locks[transaction_id].extend(acquired_resources)
    
                    self.stats['locks_granted'] += len(acquired_resources)
                    return True, "SUCCESS"
    
                except Exception as e:
                    self._rollback_acquired_locks(transaction_id, acquired_resources)
                    return False, f"ERROR: {str(e)}"
    
        def _get_intent_mode(self, target_mode: str) -> str:
            """타겟 모드에 따른 적절한 인텐트 모드 반환"""
            intent_mapping = {
                'S': 'IS',    # 공유 잠금을 위한 인텐트
                'X': 'IX',    # 배타 잠금을 위한 인텐트  
                'IS': 'IS',   # 이미 인텐트 모드
                'IX': 'IX',   # 이미 인텐트 모드
                'SIX': 'IX'   # SIX를 위한 인텐트
            }
            return intent_mapping.get(target_mode, 'IS')
    
        def _try_acquire_single(self, transaction_id: str, resource_path: str, 
                               mode: str) -> tuple[bool, str]:
            """단일 리소스에 대한 잠금 시도"""
            # 1. 기존 잠금과의 호환성 검사
            if resource_path in self.lock_table:
                current_locks = self.lock_table[resource_path]
    
                for existing_txn, existing_mode in current_locks.items():
                    if existing_txn != transaction_id:
                        if mode not in self.compatibility_matrix.get(existing_mode, set()):
                            # 호환되지 않음 - 대기 필요
                            self._add_to_wait_queue(transaction_id, resource_path, mode)
                            return False, f"Incompatible with {existing_mode} held by {existing_txn}"
    
            # 2. 호환 가능하면 잠금 부여
            if resource_path not in self.lock_table:
                self.lock_table[resource_path] = {}
    
            self.lock_table[resource_path][transaction_id] = mode
            return True, "GRANTED"
    
        def release_transaction_locks(self, transaction_id: str):
            """트랜잭션의 모든 잠금 해제"""
            with self._lock:
                if transaction_id not in self.transaction_locks:
                    return
    
                # 역순으로 잠금 해제 (리프 -> 루트)
                for resource_path in reversed(self.transaction_locks[transaction_id]):
                    if resource_path in self.lock_table:
                        self.lock_table[resource_path].pop(transaction_id, None)
    
                        # 빈 리소스 정리
                        if not self.lock_table[resource_path]:
                            del self.lock_table[resource_path]
    
                    # 대기 중인 트랜잭션들 깨우기
                    self._wakeup_waiters(resource_path)
    
                del self.transaction_locks[transaction_id]
    
        def get_lock_status(self) -> Dict:
            """현재 잠금 상태 반환 - 디버깅용"""
            with self._lock:
                return {
                    'active_locks': dict(self.lock_table),
                    'waiting_transactions': dict(self.wait_queue),
                    'statistics': self.stats.copy()
                }
    
  3. 3 단계: 동시성 테스트 시나리오

     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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    
    def run_concurrency_simulation():
        """실제 동시성 시나리오 시뮬레이션"""
    
        # 환경 설정
        db_hierarchy, resources = create_sample_hierarchy()
        lock_manager = EnhancedLockManager()
    
        def transaction_scenario_1():
            """시나리오 1: 사용자 정보 업데이트"""
            txn_id = "TXN_UPDATE_USER"
            print(f"[{txn_id}] Starting user update transaction…")
    
            # 특정 사용자 레코드에 배타 잠금
            success, msg = lock_manager.acquire_hierarchical_lock(
                txn_id, resources['user_1001'], 'X'
            )
    
            if success:
                print(f"[{txn_id}] Successfully acquired exclusive lock on user_1001")
                print(f"[{txn_id}] Updating user data…")
                time.sleep(2)  # 작업 시뮬레이션
                print(f"[{txn_id}] User update completed")
            else:
                print(f"[{txn_id}] Lock acquisition failed: {msg}")
    
            lock_manager.release_transaction_locks(txn_id)
            print(f"[{txn_id}] Transaction completed and locks released")
    
        def transaction_scenario_2():
            """시나리오 2: 테이블 전체 스캔 (읽기)"""
            txn_id = "TXN_TABLE_SCAN"
            print(f"[{txn_id}] Starting table scan transaction…")
    
            # 테이블 전체에 공유 잠금
            success, msg = lock_manager.acquire_hierarchical_lock(
                txn_id, resources['user_1001'].parent.parent, 'S'  # users 테이블
            )
    
            if success:
                print(f"[{txn_id}] Successfully acquired shared lock on users table")
                print(f"[{txn_id}] Scanning table data…")
                time.sleep(1.5)  # 스캔 시뮬레이션
                print(f"[{txn_id}] Table scan completed")
            else:
                print(f"[{txn_id}] Lock acquisition failed: {msg}")
    
            lock_manager.release_transaction_locks(txn_id)
            print(f"[{txn_id}] Transaction completed and locks released")
    
        def transaction_scenario_3():
            """시나리오 3: 다른 레코드 업데이트 (성공 케이스)"""
            txn_id = "TXN_UPDATE_USER2"
            print(f"[{txn_id}] Starting another user update…")
    
            # 다른 사용자 레코드에 배타 잠금 (호환 가능)
            success, msg = lock_manager.acquire_hierarchical_lock(
                txn_id, resources['user_1002'], 'X'
            )
    
            if success:
                print(f"[{txn_id}] Successfully acquired exclusive lock on user_1002")
                print(f"[{txn_id}] Updating different user data…")
                time.sleep(1)  # 작업 시뮬레이션  
                print(f"[{txn_id}] User update completed")
            else:
                print(f"[{txn_id}] Lock acquisition failed: {msg}")
    
            lock_manager.release_transaction_locks(txn_id)
            print(f"[{txn_id}] Transaction completed and locks released")
    
        # 동시 실행 테스트
        print("=== Intent Lock Concurrency Simulation ===")
        with ThreadPoolExecutor(max_workers=3) as executor:
            # 동시에 3개 트랜잭션 실행
            future1 = executor.submit(transaction_scenario_1)
            future2 = executor.submit(transaction_scenario_2)  
            future3 = executor.submit(transaction_scenario_3)
    
            # 짧은 지연으로 순차 시작 (실제 환경 모사)
            time.sleep(0.1)
    
            # 모든 트랜잭션 완료 대기
            future1.result()
            future2.result() 
            future3.result()
    
        # 최종 통계 출력
        print("\n=== Final Statistics ===")
        status = lock_manager.get_lock_status()
        for key, value in status['statistics'].items():
            print(f"{key}: {value}")
    
    if __name__ == "__main__":
        run_concurrency_simulation()
    
실행 결과
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
=== Intent Lock Concurrency Simulation ===
[TXN_UPDATE_USER] Starting user update transaction…
[TXN_UPDATE_USER] Successfully acquired exclusive lock on user_1001
[TXN_TABLE_SCAN] Starting table scan transaction…
[TXN_TABLE_SCAN] Lock acquisition failed: Incompatible with IX held by TXN_UPDATE_USER
[TXN_UPDATE_USER2] Starting another user update…
[TXN_UPDATE_USER2] Successfully acquired exclusive lock on user_1002
[TXN_UPDATE_USER] Updating user data…
[TXN_UPDATE_USER2] Updating different user data…
[TXN_UPDATE_USER2] User update completed
[TXN_UPDATE_USER2] Transaction completed and locks released
[TXN_UPDATE_USER] User update completed
[TXN_UPDATE_USER] Transaction completed and locks released

=== Final Statistics ===
locks_granted: 12
locks_waited: 1
deadlocks_detected: 0
avg_wait_time: 0.0
추가 실험
  1. 호환성 테스트: 다양한 모드 조합으로 호환성 매트릭스 검증
  2. 성능 측정: 잠금 획득/해제 시간 측정 및 최적화
  3. 교착상태 시뮬레이션: 순환 대기 상황 생성 및 검출
실습 예제: InnoDB 에서 IS/IX 충돌 관찰
목적
사전 요구사항
단계별 구현
  1. 테이블 준비

    1
    2
    3
    4
    5
    6
    7
    
    CREATE TABLE orders (
      id BIGINT PRIMARY KEY,
      status VARCHAR(20),
      amount DECIMAL(10,2),
      INDEX (status)
    ) ENGINE=InnoDB;
    INSERT INTO orders VALUES (1,'NEW'),(2,'NEW'),(3,'DONE');
    
  2. 세션 A: 테이블 스캔 (READ) 시나리오

    1
    2
    3
    4
    
    -- 세션 A
    START TRANSACTION;
    -- 옵티마이저 상황에 따라 테이블/인덱스 스캔 발생
    SELECT * FROM orders WHERE status IN ('NEW','DONE') FOR SHARE; -- S/IS 성격
    
  3. 세션 B: 단건 수정 시도

    1
    2
    3
    
    -- 세션 B
    START TRANSACTION;
    UPDATE orders SET amount = amount + 1 WHERE id = 2; -- IX + Row X 필요
    
  4. 관찰 (예시)

    1
    2
    3
    
    -- 잠금 관찰(버전에 따라 뷰가 다를 수 있음)
    SELECT * FROM performance_schema.data_locks\G
    SELECT * FROM performance_schema.data_lock_waits\G
    
실행 결과/검증
추가 실험

실제 도입 사례 분석

실제 도입 사례: 전자상거래 주문 처리 (OLTP + 야간 정산 배치)
배경/도입 이유
구현 아키텍처
graph TB
  A[주문 API] -->|OLTP| B[(DB: orders)]
  C[배치/정산] -->|스캔| B
  B --> D["Lock Manager(Intent+S/X)"]
핵심 구현 (설정 중심)
성과/결과
교훈
실제 도입 사례: 대형 전자상거래 플랫폼의 주문 처리 시스템
배경 및 도입 이유

글로벌 전자상거래 기업 A 사는 일 평균 백만 건의 주문을 처리하는 대규모 시스템을 운영하고 있었습니다. 기존 단순 row-level locking 으로는 다음 문제가 발생했습니다:

도입 결정 요인:

구현 아키텍처
graph TB
    subgraph "Application Layer"
        API[Order API]
        WS[Web Service]
        BG[Background Jobs]
    end
    
    subgraph "Transaction Coordination Layer"
        TC[Transaction Coordinator]
        LM[Enhanced Lock Manager]
    end
    
    subgraph "Database Layer"
        subgraph "Hierarchical Structure"
            DB[(E-commerce DB)]
            T1[(Orders Table)]
            T2[(Inventory Table)]
            T3[(Users Table)]
            P1[Page 1…N]
            R1[Records]
        end
    end
    
    API --> TC
    WS --> TC  
    BG --> TC
    TC --> LM
    LM --> DB
    
    DB --> T1
    DB --> T2
    DB --> T3
    T1 --> P1
    P1 --> R1

핵심 구조:

핵심 구현 코드
  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
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
class EcommerceTransactionManager:
    """전자상거래 특화 트랜잭션 관리자"""
    
    def __init__(self, lock_manager: EnhancedLockManager):
        self.lock_manager = lock_manager
        self.db_connection = DatabaseConnection()
        
    async def process_order(self, order_data: dict) -> dict:
        """주문 처리 - 인텐트 모드 활용 최적화 버전"""
        transaction_id = f"ORDER_{order_data['order_id']}"
        
        try:
            # Phase 1: 재고 확인 (공유 잠금)
            inventory_resources = self._get_inventory_resources(order_data['items'])
            for resource in inventory_resources:
                success, msg = self.lock_manager.acquire_hierarchical_lock(
                    transaction_id, resource, 'S'  # 재고 조회는 공유 모드
                )
                if not success:
                    raise InsufficientInventoryException(f"Cannot lock inventory: {msg}")
            
            # Phase 2: 재고 차감 (배타 잠금으로 승격)
            for item in order_data['items']:
                inventory_resource = self._get_item_resource(item['product_id'])
                success, msg = self.lock_manager.acquire_hierarchical_lock(
                    transaction_id, inventory_resource, 'X'  # 업데이트를 위한 배타 모드
                )
                if not success:
                    raise LockConflictException(f"Cannot acquire exclusive lock: {msg}")
                
                # 실제 재고 차감
                await self._update_inventory(item['product_id'], -item['quantity'])
            
            # Phase 3: 주문 생성 (인텐트 모드로 최적화)
            orders_table_resource = self._get_orders_table_resource()
            success, msg = self.lock_manager.acquire_hierarchical_lock(
                transaction_id, orders_table_resource, 'IX'  # 테이블에 인텐트 배타
            )
            if not success:
                raise LockConflictException(f"Cannot acquire intent exclusive: {msg}")
            
            # 새 주문 레코드 생성
            order_id = await self._create_order_record(order_data)
            
            # Phase 4: 트랜잭션 커밋
            await self.db_connection.commit()
            
            return {'status': 'success', 'order_id': order_id}
            
        except Exception as e:
            await self.db_connection.rollback()
            raise
        finally:
            # 모든 잠금 해제
            self.lock_manager.release_transaction_locks(transaction_id)
    
    async def bulk_inventory_update(self, updates: List[dict]) -> dict:
        """대량 재고 업데이트 - SIX 모드 활용 사례"""
        transaction_id = f"BULK_UPDATE_{int(time.time())}"
        
        try:
            # 테이블 전체에 SIX 모드 적용
            # (전체 테이블 공유 + 개별 레코드 배타 의도)
            inventory_table = self._get_inventory_table_resource()
            success, msg = self.lock_manager.acquire_hierarchical_lock(
                transaction_id, inventory_table, 'SIX'
            )
            
            if not success:
                raise LockConflictException(f"Cannot acquire SIX lock: {msg}")
            
            # 개별 아이템 업데이트 (이미 SIX로 인한 인텐트 선언됨)
            updated_items = 0
            for update in updates:
                await self._update_inventory(
                    update['product_id'], 
                    update['quantity_delta']
                )
                updated_items += 1
            
            await self.db_connection.commit()
            return {'status': 'success', 'updated_items': updated_items}
            
        except Exception as e:
            await self.db_connection.rollback()
            raise
        finally:
            self.lock_manager.release_transaction_locks(transaction_id)

# 성능 모니터링 코드
class PerformanceMonitor:
    """인텐트 모드 성능 모니터링"""
    
    def __init__(self):
        self.metrics = {
            'lock_acquisition_time': [],
            'transaction_duration': [], 
            'deadlock_count': 0,
            'lock_escalation_count': 0
        }
    
    def record_lock_performance(self, acquisition_time: float, 
                               escalation_occurred: bool = False):
        """잠금 성능 기록"""
        self.metrics['lock_acquisition_time'].append(acquisition_time)
        if escalation_occurred:
            self.metrics['lock_escalation_count'] += 1
    
    def get_performance_report(self) -> dict:
        """성능 리포트 생성"""
        if not self.metrics['lock_acquisition_time']:
            return {'status': 'no_data'}
        
        times = self.metrics['lock_acquisition_time']
        return {
            'avg_lock_time': sum(times) / len(times),
            'p95_lock_time': sorted(times)[int(len(times) * 0.95)],
            'total_deadlocks': self.metrics['deadlock_count'],
            'escalation_rate': self.metrics['lock_escalation_count'] / len(times)
        }
성과 및 결과

정량적 성과:

정성적 개선:

비용 효과:

교훈 및 시사점

재현 시 유의점:

  1. 점진적 도입: 전체 시스템을 한 번에 바꾸지 말고 핵심 트랜잭션부터 단계적 적용
  2. 모니터링 강화: 잠금 상태와 성능 지표를 실시간으로 모니터링하는 대시보드 필수
  3. 팀 교육: 개발팀의 인텐트 모드에 대한 이해도가 성공의 핵심 요소

확장 아이디어:

의도 잠금 통합 전략과 운영 청사진

의도 잠금 통합·연계 전략 일람
통합 대상왜 (목적)무엇 (구성요소)어떻게 (절차/패턴)획득 가치주의점
MVCC+ 의도 잠금읽기 비차단, 쓰기 정밀 제어MVCC 스냅샷, IS/IX/SIX+S/X, 범위락읽기=스냅샷, 쓰기=의도→실락, 팬텀 구간은 범위락읽기 처리량↑, 쓰기 정확성↑범위락 남용 시 차단↑
OCC+ 의도 잠금저충돌 환경 비용↓OCC 검증, 의도 잠금기본 OCC, 임계 구간만 의도 잠금재시도 비용과 차단의 균형충돌률 임계 모니터링
분산 락/합의샤드 간 일관성로컬 의도 잠금, 글로벌 락/합의샤드 내 의도, 샤드 간 전역 순서전역 불변성 유지네트워크 지연·분할
파티셔닝/샤딩충돌 도메인 분리파티션 키, 라우팅파티션 단위 락·승격핫스팟 국소화키 스큐·재밸런싱
온라인 DDL무중단 변경상위 강한 락 + 백그라운드테이블 상위 락 최소화, 단계적 전환서비스 지속성롱 TX·재빌드 시간
큐/아웃박스쓰기 직렬화메시지 큐, 아웃박스, 멱등키DB→아웃박스→큐→소비데드락·경합 감소지연 허용 필요
캐시/CQRS읽기 경합 완화캐시, 읽기 모델 분리쓰기 후 무효화/TTL, 리드 전용 모델읽기 지연↓일관성 관리
관측/자동화예측 가능 운영락 뷰·로그, 임계 튜닝대기체인 분석→정책 가변화p95 안정과최적화 경계
의도 잠금 통합 카테고리 체계
엔진 내부 (저장소) 결합
요소목적통합 방법가치주의/한계
MVCC+ 의도읽기 비차단읽기 MVCC, 쓰기 의도→실락읽기 처리량↑오래 지속 TX 주의
범위락팬텀 방지인덱스 키 - 레인지정확성↑범위 과대 잠금 주의
SIX리드 + 부분 수정테이블 S + 일부 X경합↓라이터 다수 시 병목
트랜잭션 전략 결합
요소목적통합 방법가치주의/한계
OCC저충돌 최적버전 검증·재시도오버헤드↓재시도 급증 위험
의도 잠금고충돌 안정IS/IX/SIX+S/X지연 안정락 메타비용
하이브리드적응임계 기반 전환평균 비용↓임계 튜닝 필요
분산·복제·샤딩 결합
요소목적통합 방법가치주의/한계
글로벌 락/합의전역 순서리더/합의불일치 방지지연·분할
파티셔닝충돌 분리키 기반 라우팅핫스팟 완화스큐·재분배
리드 리플리카읽기 확장스냅샷 읽기읽기 확장지연·일관성
아키텍처 패턴 결합
요소목적통합 방법가치주의/한계
큐/아웃박스쓰기 직렬화DB→아웃박스→큐데드락↓지연 허용
캐시읽기 우회TTL/무효화리드 지연↓일관성 관리
CQRS리드 분리읽기 모델별 DB확장 용이동기화 비용
운영·관측·자동화 결합
요소목적통합 방법가치주의/한계
대기체인 분석병목 식별그래프/로그원인 명확화과최적화
임계 가변화동시성 안정시간대·크기별p95 안정정책 복잡도
롱 TX 가드장기 보유 방지타임아웃·분할데드락↓재시도 설계
의도 잠금 통합 로드맵 요약표
카테고리핵심 목표주요 결합 요소대표 패턴/절차기대 가치주요 리스크
엔진 내부읽기 비차단·팬텀 방지MVCC/SSI, 의도 잠금, 범위락읽기=MVCC, 쓰기=의도→실락, 필요한 곳만 범위락처리량↑·정합성↑범위 과대 잠금
트랜잭션 전략비용 최적화OCC, 의도 잠금충돌률 임계 기반 스위칭평균 비용↓임계 튜닝 난도
분산·샤딩전역 일관성로컬 의도, 글로벌 락/합의, 파티션샤드 내/간 제어 분리전역 불변성지연·분할
아키텍처경합 완화큐/아웃박스, 캐시/CQRS쓰기 직렬화, 읽기 우회데드락↓·지연↓일관성 관리
운영·자동화예측 가능성관측·임계·정책대기체인 분석→정책 가변화p95 안정과최적화

Phase 6: 운영 및 최적화

의도 락 기반 성능·확장 청사진

의도 락은 상위에서 " 여기 아래에 곧 S/X 를 걸겠다 " 를 미리 알린다. 성능을 높이려면 범위락을 줄이고, 하위에서만 정확히 잠그며, 대기는 시간 제한과 재시도로 다룬다. 확장하려면 파티션·샤드별로 의도 락 정책을 다르게 두고, 읽기는 리플리카로 분리한다. 수치로 모니터링하고 필요 시 에스컬레이션 정책을 조정하면 된다.

의도 락 성능·확장 전략 맵
측면무엇을왜 (의도 락 관점)어떻게 (핵심 전술)핵심 지표
설계: 쿼리·데이터범위락 최소화하위 S/X 충돌 표면 축소선택도 높은 인덱스, 커버링, 정규화/파티션 키 정렬, 트랜잭션 범위 단축P95 대기, 범위락 비율
설계: 모드·그라뉼러리티SIX·IS/IX 규칙화스캔 병렬성 + 부분 X 허용테이블 SIX+ 하위 X, 행 우선 접근, 에스컬레이션 예외 테이블에스컬레이션률, 상위 충돌률
런타임: 락 매니저메모리/CPU 최적화매트릭스 판정·대기열 비용 절감락 테이블 샤딩, 고성능 해시, NUMA 배치, CAS 큐, 객체 재사용락 수, 컨텍스트 스위칭
런타임: 대기 제어보유시간/재시도교착·긴 대기 완화보유 상한, 우선순위 대기, 타임아웃·멱등 재시도, 배치 시간 분리타임아웃률, 데드락/분
아키텍처: 확장파티션·샤딩·리플리카충돌 도메인 축소파티션별 IS/IX/SIX 정책 차등, 샤드 고정 순서, 읽기 리플리카샤드별 대기, 스루풋
관측: 자동화SLO 기반 피드백정책을 데이터로 폐쇄루프잠금 대시보드, 경보·런북, 벤치 (YCSB/TPC-C)SLO 위반율, 회복시간

핵심 원리: 필요한 곳만 강하게 (SIX/키 - 범위/직렬화), 나머지는 가볍게 (버전닝/행락), 그리고 관측–정책–실험의 반복.

의도 락 최적화 분류 체계
쿼리/데이터 구조
전술효과위험/주의지표
커버링/선택도 인덱스범위락 감소, 캐시 적중↑쓰기 비용↑범위락 비율, I/O 히트
트랜잭션 범위 단축보유시간↓, 대기↓애플 재시도 필요락 보유시간, 타임아웃률
파티션 프루닝충돌 도메인↓파티션 키 설계 부담샤드/파티션 대기
모드/그라뉼러리티 (SIX·IS/IX)
전술효과위험/주의지표
SIX+ 하위 X스캔 병렬성 + 부분 X상위 충돌↑ 가능상위 충돌률
행 우선 접근병렬성↑락 수↑ 메모리↑에스컬레이션률
예외 테이블승격 방지정책 관리 복잡승격 실패/차단 수
격리·버전닝·키 - 범위
전술효과위험/주의지표
스냅샷 읽기대기 제거재시도/검증 필요읽기 대기시간
선택적 키 - 범위팬텀 방지지연↑팬텀 발생/지연
경로별 격리비용 최적화복잡성↑경로별 SLO
락 매니저·대기 제어 (런타임)
전술효과위험/주의지표
테이블 샤딩/NUMA스케일↑구현 난이도컨텍스트 스위칭
CAS 대기열경합↓공평성 이슈큐 대기시간
보유 상한/재시도교착 완화멱등 필요데드락/타임아웃
분산·확장 (샤딩/리플리카)
전술효과위험/주의지표
샤드 순서 고정교착↓크로스샤드 지연샤드별 대기
파티션별 정책최적화↑운영 복잡파티션 SLO
리플리카 읽기대기↓일관성 창스테일 비율
관측·벤치·자동화
전술효과위험/주의지표
대시보드/알림이상 조기 감지알림 피로SLO 위반율
벤치마크정량 비교샘플링 편향TPS/지연
자동 튜닝빠른 수렴과최적화변경 전후 대기
의도 락 성능·확장 통합표
층위전략 묶음대표 전술기대 효과주요 지표리스크/보완
설계쿼리/데이터커버링 인덱스, 범위 단축범위락↓, 대기↓P95 대기쓰기 비용↑ → 배치 창 분리
설계모드/그라뉼러리티SIX+ 하위 X, 예외 테이블스캔 병렬성 + 부분 X상위 충돌률상위 충돌↑ → 후보 식별 인덱스
런타임락 매니저샤딩/NUMA/CAS/재사용판정/대기 비용↓락 수·큐 대기구현 난도↑ → 점진 도입
런타임대기 제어보유 상한/재시도/우선순위교착/긴 대기↓타임아웃·데드락멱등 필요
아키텍처분산 확장샤딩, 파티션별 정책, 리플리카충돌 도메인↓, 읽기 분리샤드별 스루풋일관성 창 → SLA 설계
관측자동화대시보드/벤치/런북데이터 기반 튜닝SLO 위반율과최적화 주의

Intent 락 문제 진단·해결의 기술

트러블슈팅의 핵심은 **" 상위에서 거르고, 대기는 짧게, 원인은 구조로 제거 “**다. 먼저 대기 그래프와 **호환성 표 (LCM)**로 누가 누구를 막는지를 그려본다. 즉각 조치는 세션 정리·타임아웃·재시도로 꼬여 있는 대기를 푼다. 근본 해결은 획득 순서 표준화, 에스컬레이션 임계/큐 공정성 재설정, 인덱스와 파티셔닝으로 범위 축소다. 갭/키 - 범위 경합은 대개 인덱스/조건 설계 문제로 귀결되고, 장수 트랜잭션은 커밋 습관과 자동 타임아웃으로 잡는다.

Intent 트러블슈팅 한눈에 보기
문제 유형근본 원인 (왜)증상/지표 (무엇)즉각 해결 (어떻게 -1)근본 개선 (어떻게 -2)
데드락잠금 순서 불일치, 상호 업그레이드 (U→X)타임아웃·롤백, 대기 그래프 사이클가해 세션 종료, 타임아웃 상향/재시도 백오프획득 순서 표준화, 한 쿼리에서 읽기→쓰기 순서 고정, U 사용 최소화
상위 충돌 폭증에스컬레이션 과다 (행→테이블), 대량 스캔p95/99 지연↑, 에스컬레이션 카운트↑에스컬레이션 임계 상향/일시 해제인덱스 보강, 파티셔닝, 배치 스캔 시간대 분리
갭/키 - 범위 경합인덱스 부재, 넓은 범위 조건삽입 지연, Range/Gap 잠금 다발쿼리 힌트·범위 축소, 커버링 인덱스 적용조건 정규화, 적절한 격리 수준 선택 (RC/RR/Serializable)
장수 트랜잭션대화형 세션 방치, 커밋 지연오래된 스냅샷/락 보유, 큐 적체세션 종료/트랜잭션 분할업무 플로우 리팩터링, 자동 타임아웃 설정
호환성 오판모드 선택 오류 (IX↔SIX 등)예상외 대기/차단LCM 재검토·락 힌트 조정모드 매핑 규칙 고정·테스트 추가
기아/불공정 대기큐 정책 미흡 (FIFO 없음)특정 세션 장기 대기우선권 부여/큐 정책 교정공정 큐 도입, 장기 대기 탐지·승급
래치/내부 경합Lock Table/Latch 경쟁짧은 CPU 피크·긴 대기 꼬리배치 분산, 동시 연결 제한샤딩·핫스팟 해소, 스키마/인덱스 재설계
Intent 이슈 원인 - 영역 분류
프로토콜·순서 기인 이슈
항목핵심 원인진단 포인트즉각 조치구조적 개선
데드락순서 불일치대기 그래프 사이클가해 세션 종료·재시도순서 표준화·쿼리 재작성
업그레이드 충돌동시 U→X업그레이드 대기 급증U 제거/바로 X설계상 점유 순서 고정
쿼리·스키마·워크로드 설계 이슈
항목핵심 원인진단 포인트즉각 조치구조적 개선
갭/키 - 범위 경합인덱스 미비Range/GAP 락 다발힌트·조건 축소인덱스/파티셔닝
장수 트랜잭션커밋 지연오래된 스냅샷·대기 꼬리세션 정리자동 타임아웃/리팩터
핫스팟단일 키 집중특정 키 대기 집중요청 분산해시·샤딩·캐시
엔진 설정·운영 정책 이슈
항목핵심 원인진단 포인트즉각 조치구조적 개선
상위 충돌 폭증과도 승격에스컬레이션 카운트↑임계 상향설계 리밸런싱
기아·불공정큐 정책 미흡특정 세션 장기 대기우선권 조정공정 큐·장기 대기 탐지
DDL–DML 충돌변경 시점 혼재Sch/Meta 락 대기변경 작업 중단변경 윈도우·피크 분리
Intent 이슈 통합 처방 매트릭스
카테고리대표 이슈주 원인핵심 지표/진단즉각 조치구조적 개선
프로토콜·순서데드락/업그레이드 충돌순서 불일치/U→X 중첩대기 그래프, 업그레이드 대기세션 정리·재시도획득 순서 고정·U 최소화
설계 (쿼리/스키마)갭/키 - 범위 경합·핫스팟인덱스 미비·스캔 과대Range/GAP 락 비율·핫키 대기힌트·범위 축소인덱스·파티셔닝·샤딩
엔진/운영상위 충돌·기아·DDL 충돌과격 승격·불공정 큐·변경 혼재에스컬레이션·장기 대기·Sch 락임계/큐/윈도우 조정정책 표준화·모니터링 상시화

종합 정리 및 학습 가이드

내용 종합

Intent Modes(의도 락) 는 " 아래에서 특정 행에 락을 잡을 예정이니, 위에서는 그걸 감안해서 판단해줘 " 라는 신호다.
테이블에 IS/IX/SIX 같은 가벼운 플래그를 세워두면, 다른 트랜잭션이 테이블 전체를 잠그려 하거나 DDL 을 시도할 때 즉시 충돌 여부를 알 수 있다.
그래서 스캔·DDL·OLTP 가 섞인 환경에서 " 될 일/안 될 일 " 을 빠르게 가려 대기 시간과 불필요한 탐색을 줄인다.
중요한 포인트는 IX↔IX 가 호환이라는 점이다.
각자 서로 다른 일부 행을 만지려는 의도이므로 테이블 전체를 막지 않는다 (실제 경합은 행/키에서 X 가 잡힐 때 생긴다).
이 아이디어는 Gray 의 다중 그레뉼러리티 잠금에서 출발했고, 오늘날 InnoDB·Db2·SQL Server 등에서 표준처럼 사용된다. Postgres 도 명칭은 달라도 테이블/행 락과 호환표로 같은 효과를 낸다.

실무 적용 가이드

단계체크 항목핵심 실행 지침합격 기준 (예시)
사전 분석계층/트랜잭션 분류테이블/파티션/행 계층 정의, 읽기/쓰기/혼합 트랜잭션 식별대상 객체·경로 다이어그램 완성
설계의도 락 규칙 수립상위 IS/IX/SIX 선취 후 하위 S/X, 범위 정확성은 키 - 범위/격리로 보완충돌 행렬·획득 순서 문서화
설계에스컬레이션 정책임계치·예외 테이블·우선순위 정의대량 작업 시 승격 로그 정상
개발획득 순서/재시도부모→자식 순, 타임아웃/데드락 재시도·멱등 처리무한 대기 없음·재시도 성공률 목표치
개발힌트/SQL 패턴UPDLOCK/ROWLOCK, FOR UPDATE 등 목적 맞는 패턴 적용경합 구간 락 범위 축소 확인
테스트혼합 부하/팬텀R/W 혼합, 범위 정확성·성능 A/B목표 P95 대기·처리량 달성
운영모니터링/알림대기·데드락·에스컬레이션율, 장기 대기 알림SLO 내 유지·알림 MTTR 목표치
확장분산 시나리오샤드 순서 고정, 논리락·사가로 외부 자원 동기화교차 샤드 대기/교착 미발생

학습 로드맵

Phase목적/핵심 주제필수 개념산출물 (Outcome)권장 기간
1 기본Lock Modes & Compatibility 이해S/X/IS/IX/SIX, 5×5 매트릭스, 요청→판정→대기/해제호환성 퀴즈 20 문항, 미니 파이프라인 노트1–2 주
2 MGL+2PL의도 잠금 기반 계층 락킹 숙달상→하 IS/IX/SIX 순서, SIX 패턴, 변환/에스컬레이션, 데드락 저감락 획득/변환 시나리오 도식, 에스컬 정책 초안2–3 주
3 엔진 관찰/튜닝실제 엔진에서의 관측·진단·최적화pg_locks/PerfSchema/Ext.Events, 대기 체인 해석, SKIP LOCKED관찰 리포트 1 건, 튜닝 체크리스트 v12–3 주
4 대규모 적용대규모 워크로드에서의 설계/운영파티션·인덱스와 의도 잠금, 배치/온라인 공존, SLO 기반 정책시뮬 워크로드 결과(대기/처리량 그래프), 운영 가이드 v13–4 주

학습 항목 정리

Phase목적/핵심 주제필수 개념산출물 (Outcome)권장 기간
1 기본Lock Modes & Compatibility 이해S/X/IS/IX/SIX, 5×5 매트릭스, 요청→판정→대기/해제호환성 퀴즈 20 문항, 미니 파이프라인 노트1–2 주
2 MGL+2PL의도 잠금 기반 계층 락킹 숙달상→하 IS/IX/SIX 순서, SIX 패턴, 변환/에스컬레이션, 데드락 저감락 획득/변환 시나리오 도식, 에스컬 정책 초안2–3 주
3 엔진 관찰/튜닝실제 엔진에서의 관측·진단·최적화pg_locks/PerfSchema/Ext.Events, 대기 체인 해석, SKIP LOCKED관찰 리포트 1 건, 튜닝 체크리스트 v12–3 주
4 대규모 적용대규모 워크로드에서의 설계/운영파티션·인덱스와 의도 잠금, 배치/온라인 공존, SLO 기반 정책시뮬 워크로드 결과(대기/처리량 그래프), 운영 가이드 v13–4 주

용어 정리

카테고리 (축)용어 (한글·영어·약어)정의 (핵심)주 적용 레벨대표 상호작용/호환 핵심실무 활용 포인트
의미/목적의도 공유 (Intent Shared, IS)하위에 S 를 둘 의도테이블↑ → 행↓IS 는 IS/IX/S/SIX 와 호환대량 읽기 탐색 시 상·하위 충돌 조기 차단
의미/목적의도 배타 (Intent Exclusive, IX)하위에 X 를 둘 의도테이블↑ → 행↓IX 는 IS/IX 와 호환, S/SIX 와 비호환대량 갱신 탐색 시 충돌 신호로 사용
의미/목적공유 + 의도 배타 (Shared with Intent Exclusive, SIX)상위는 S, 하위 일부 X 의도테이블↑ ↔ 행↓SIX 는 IS 만 호환, S/IX/SIX 비호환대량 조회 + 부분 갱신 혼재 패턴
적용 레벨다중 그라뉼러리티 (MGL, 없음)복수 레벨 자원에 락테이블/페이지/행/키범위의도 락과 결합해 상수 시간 판정계층 탐색 속도·안정성 확보
호환/운용호환성 매트릭스 (Compatibility Matrix)허용/충돌 표준 규칙전 레벨보유 vs 요청 상호작용의 기준정책 일관성·튜닝·리뷰 기준
호환/운용락 에스컬레이션 (Lock Escalation)하위→상위 자동 승격주로 테이블락 수·메모리 제어대규모 DML/배치 안정화
호환/운용락 관리자 (Lock Manager)부여/대기/해제 판정시스템 내부호환성 표로 그랜트/대기 결정운영 지표 (대기/교착) 관측 포인트
호환/운용교착상태 (Deadlock)순환 대기전 레벨호환 실패·획득 순서로 발생탐지/타임아웃/재시도 정책 설계

참고 및 출처