2단계 잠금 프로토콜 (2PL)과 데드락 상관관계
핵심 인사이트 (3줄 요약)
- 본질: 데이터베이스 세계에서 직렬성(Serializability) 무결성을 보장하기 위해 트랜잭션 수명 내내 락(Lock)을 쥐는 시기(Growing Phase)와 일정 시점 뒤에 전부 뿜뿜 푸는 시기(Shrinking Phase) 2단계를 엄격히 쪼개놓은 동시성 락(Lock) 통제 아키텍처다.
- 가치: 2단계를 철저히 나누어 데이터 일관성 붕괴(격리성 파편화)라는 최악의 오염을 100% 막아내는 눈부신 성과를 거두었으나, 이로 인해 모든 자원을 오랫동안 쥐고 놓지 못하는 '점유 및 대기(Hold and Wait)'의 구조적 함정 탓에 교착 상태(Deadlock) 빈도가 미친 듯이 수직 상승하는 상극의 트레이드오프를 품고 있다.
- 융합: 이 구조적 데드락의 공포를 무마하기 위해 실무 RDBMS 코어들은 2PL 기조 철학 위에
대기 그래프 WFG 주입 탐지,Timeout 롤백, 그리고 읽을 땐 아예 락을 안 걸어도 되는 읽기 자유 만능 버전인MVCC 기법까지 현대적으로 덕지덕지 융합시켜 2PL의 단점을 수술해 냈다.
Ⅰ. 개요 및 필요성
DBMS의 세계에서는 데이터가 꼬여서 오염되는 것(Lost Update, Dirty Read 등)이 데드락 에러 터지는 것보다 수천 배 더 무섭다 (애먼 사람 통장 잔고가 뒤바뀐다고 생각해 보라!). 그래서 트랜잭션이 여러 락(자원)을 건드릴 때 이상한 엄격한 규칙을 강제하도록 창조했는데, 이것이 바로 수학적 직렬성을 100% 개런티하는 2단계 잠금 (Two-Phase Locking, 2PL) 프로토콜이다.
룰은 초간단하다. 모든 트랜잭션의 락 제어 주기를 2개의 페이즈(2 Phase)로 쩍 갈라버린다.
- Phase 1 (Growing, 확장): 오직 은행 강도처럼 테이블이나 행의 락(Lock)을 줍줍하며 획득(Acquire)만 할 수 있다. 하지만 절대 뺏은 걸 바닥에 내려놓지 못한다.
- Phase 2 (Shrinking, 수축): 자기가 모아둔 락 중 단 1개라도 바닥에 내려놨다(Release)? 그럼 이때부터 난 무조건 "수축기"로 접어든다. 다시는 평생 어떤 새로운 락(Lock)도 주워 담거나 요청(Acquire)하지 못하고 끝날 때까지 뱉어내기만 해야 한다.
💡 비유: 뷔페(데이터 테이블)에 진입한 사람(2PL 트랜잭션). [1단계 확장기]: 새우 초밥 접시(자원 락) 집고, 연어 초밥 접시 집어 손에 가득 쌓는다. [2단계 수축기]: 다 처먹고 나서 빈 접시 하나라도 테이블 위에 팅~ 내려놓는(Unlock) 그 순간부터? 영원히 그 뷔페의 어떤 새 초밥도 다시는 집지 못한다(Lock 금지 룰)며 식당 밖으로 퇴장해야만 한다.
┌────────────────────────────────────────────────────────────────┐
│ 2PL (Two-Phase Locking)의 락 획득 곡선과 비극 │
├────────────────────────────────────────────────────────────────┤
│ │
│ Lock 획득 개수 │
│ ▲ │
│ 4개 ─┤ [정점 도달] ◀ 락 포인트 (Lock Point) │
│ 3개 ─┤ / \ ◀ 여기서 락 1개 푸는 순간 돌이킬 수 없음 │
│ 2개 ─┤ / \ │
│ 1개 ─┤ / \ │
│ 0개 ─┼────/──────────\───────▶ 시간 흐름 │
│ [Phase 1] | [Phase 2] │
│ (확장:잡기만) | (수축:풀기만) │
│ │
│ [2PL 룰의 위대한 성패 (왜 데드락 공장인가?)] │
│ ▶ 결과 1. 2PL을 지키면 스케줄 트랜잭션 오염을 원천 차단함! │
│ ▶ 결과 2. 하지만 Phase 1에서 락을 4개 다 모을 때까지 한 번도 │
│ 양보(Unlock) 안 하고 버티다 보니, 딴 놈이랑 부딪히면 얄짤 │
│ 없이 서로 자원만 쥐고 침묵하는 "데드락"이 1000% 폭주함. │
└────────────────────────────────────────────────────────────────┘
📢 섹션 요약 비유: 데이터를 안 꼬이게 할 심산으로 트랜잭션이 자원을 미련하게 품 안에 잔뜩 껴안기만 하다가 나중에야 한 번에 뿜어버리는 극단적 이기주의 룰 때문에, "양손 무거운 두 사람이 외나무다리에서 마주치면 영원히 오가도 못하고 꽉 막히는 교착(Deadlock)" 병목 현상을 필연적으로 잉태합니다.
Ⅱ. 아키텍처 및 핵심 원리
2PL과 교착 상태 4대 조건의 결합 시너지
놀랍게도 교착 상태(Deadlock)를 성립하게 만드는 가장 위험한 뇌관이 바로 점유 및 대기 (Hold & Wait) 인데, 2PL 프로토콜의 1단계(Growing Phase)는 이 악마의 조건을 커널 레벨에서 우직하게 합법화시키는 장치다.
- 상호 배제 (Mutual Exclusion) 강화:
Write Lock(X)배타락은 절대 다른 쿼리에 양보하지 않음. - 점유 및 대기 (Hold and Wait) 조장: 2PL의 생존 본성. "내가 이미 A 테이블 락 잡았는데, 나 룰상 아직 수축 단계로 안 넘어갈 거니까 A 락은 절대 안 풀고 버틸게! 그러니 빨리 B 테이블 락도 마저 내놔!!" 라며 버틴다.
- 순환 대기(Circular Wait)의 수월성: 이 본질 때문에 트랜잭션 2개가 동시에 맞물려버리면 (A잡은 놈이 B기다리고, B잡은 놈이 A기다림), 둘 다 2PL의 룰(다 모으기 전까진 단계 1에서 절대 풀 수 없음)에 갇혀 버려서 100% 필연적으로 서로 양보 없이 사이클 웅덩이에 매몰된다.
📢 섹션 요약 비유: 2PL 방식은 데드락의 영혼의 단짝입니다. "한번 잡은 물건은 절대 내려놓지 않고 더 큰 물건을 마저 집어삼키기 위해 대기한다(Hold & wait)"는 수학자들의 고집 때문에, 구조적으로 데드락 사슬망에 걸려들기에 제일 좋은 뚱뚱한 그물망 타깃이 됩니다.
Ⅲ. 융합 비교 및 다각도 분석
| 락 프로토콜 | 데드락 유발 확률 (Deadlock Risk) | 데이터 정합성 (동시성 이상 현상 방지) |
|---|---|---|
| Non-2PL (아무 때나 잡고 풂) | 중간중간 락을 금방 풀어버려 데드락 잘 안 생김 | 최악 폭파! (남이 쓸다만 데이터 읽어버려 통장 잔고 꼬임) |
| 기본/엄격한 2PL (Strict 2PL) | 극히 취약함 (잡고 무조건 뻗치다가 얽혀 죽음) | 100% 직렬성 개런티 (안전 무결성의 황금 룰) |
| C2PL (Conservative 2PL) | 트랜잭션 시작 때 필요한 락 "모조리 한 번에 다 달라"고 엄포 | 데드락은 0%로 무력화시키지만, 다 모을 때까지 쿼리가 안 나가서 전체 속도병목(Throughput 폭망) 생김. 실무 채택 포기. |
📢 섹션 요약 비유: "눈치껏 자원 집어갔다 조금 쓰고 바로 버리는 프리스타일 방식"은 융통성 있어 데드락은 안 생기지만 데이터 장부가 엉망으로 찢어집니다. "2PL"은 조심스레 자기 품에 다 모일 때까지 껴안기만 하니까 장부는 보호되는데, 자기들끼리 뚱뚱해서 부딪히다 펑펑 터집니다(데드락).
Ⅳ. 실무 적용 및 기술사적 판단
실무 시나리오:
- RDBMS의 눈물겨운 2PL 심장 (MySQL InnoDB / PostgreSQL): 여러분이 매일 쓰는 엔터프라이즈 DB 엔진들은 기본적으로
Strict 2PL(엄격한 2단계 잠금: Commit 칠 때까지 얻어둔 Write Lock을 한 개도 풀지 않음) 베이스를 사용한다. 당연히 구조적으로 데드락(Deadlock Found)이 시도 때도 없이 툭툭 터질 걸 DB 아키텍트 회장님들도 알았다. 그래서 DB 엔진안에는 이를 불도저로 밀어버리는 엄청난 진압 백신 시스템들 (Wait-For-Graph 탐색기,Timeout 강제 롤백 살해)이 태생적으로 결속되어 출시된다! -> "어이, 2PL 써서 교착 터지는 건 상수니까 냅둬. 그냥 데드락 사이클 터질 때마다 내가 0.1초 만에 타임아웃/탐지로 모가지 솎아내며 트랜잭션 롤백 밀어줄게! 너흰 Retry나 해라! (복구/탐지의 실전 융합 진수)" - 현대 진화 MVCC (Multi-Version Concurrency Control) 구원기: 2PL이 쓰기(W)와 읽기(R)를 죄다 막아 세우며 그라데이션 데드락만 양산하자, "아니 데이터를 Select 읽어가는 놈은 아예 락을 잡지 말고 Undo Log에 백업해 둔 과거 버전 스냅샷 카피본을 가져다 보게 만들면 되잖아(MVCC)!" 라며 락 자체를 우회하게 했다. 이로써 2PL 환경에서 발생하는 R-W 데드락 트랜잭션의 70%가 허공으로 증발해 버리는 현대적 속도 기적을 이뤘다.
안티패턴:
- Application 단에서 임의로 락 풀기 (Release Lock 중간 삽입 꼼수): "야 DB 데드락 빡치네? 트랜잭션 (2PL 기반) 안에서 우리가 임의로 저기 쿼리 사이사이에 Unlock 명령어로 락 푸는 꼼수 코드 짜넣어라 데드락 예방하게!"
▶ 이건 비즈니스 자살 행위다. 데드락은 운 좋게 줄어들겠지만, 트랜잭션 중간에 락 풀린 그 찰나의 1밀리초 사이 다른 스레드 녀석이 그 Row를 덮어써 버려서
초과 인출(Lost Update) 은행 폭파 사고 버그가 발생하여 회사 파산 및 법적 구속을 맞는다.
📢 섹션 요약 비유: 실무자들의 피로 쓴 절대 원칙: "데드락 에러 팝업창이 수백 개 터지는 한이 있더라도 2PL의 커널 규칙(함부로 중간에 락을 풀지 않는다)은 목숨을 바쳐 사수한다." 데드락이 나면 로직 단에서 우아하게 캐치해서 재시도(Retry)하면 그만이지만, 2PL 규칙을 임의로 어기면 그 즉시 통장 잔액 천만 원이 남의 계좌로 증발하는 물리적 데이터 재앙이기 때문입니다.
Ⅴ. 기대효과 및 결론
| 기준 | 2PL 룰 포기하고 내 멋대로 락 통제 | 2PL 프로토콜 구동 + 데드락 복구 장갑차 장착 |
|---|---|---|
| 시스템 목표 달성 | 데드락 없이 속도는 쾌적함. 단 데이터 오염 장부 폭발 | 간헐적 데드락 롤백 짜증 나지만 1원 1장부 무결성 황금망 구축 |
| 트러블 슈팅 성질 | 비즈니스 논리적 붕괴라 잡을 방법도 재현 방법도 없음 | 단지 스프링 에러 로그(Deadlock Loser) 나서 Retry 로직으로 감싸 재처리해주면 됨 |
2단계 잠금 (Two-Phase Locking, 2PL)은 운영체제와 서버의 최대 숙명인 '동시 병렬성(Concurrency)'과 '트랜잭션 고립성(Isolation)'을 천칭 저울에 올렸을 때 이끌어낸 극단적인 철학적 결단의 상징이다. 컴퓨터 공학자들은 "데드락이라는 무거운 십자가 오버헤드를 평생 지고 가더라도, 동시성 병렬 오류를 막는 신뢰성(Serializability)을 얻기 위해 이 우직한 2PL 구조를 기꺼이 DBMS 엔진의 핵심 뇌관으로 받아들이겠다"고 선언했다. 그리고 이에 딸려오는 잦은 멈춤(교착) 현상을 물리치기 위해 OS 스케줄러의 타임아웃이나 WFG 디텍션 복구 체계를 뒷단에 덕지덕지 수술 접합 시키며 오늘날의 우주급 트래픽 분산 처리를 완전체 상태로 군림하게 만들었다.
📌 관련 개념 맵
| 개념 | 관계 |
|---|---|
| 교착 상태 탐지/복구 (Detection & Recovery) | 2PL의 은둔형 구조적 데드락 부작용 탓에 DB 엔진에 강제로 항시 탑재되어, 2PL이 싸놓은 데드락 똥을 매번 치워주는 영혼의 콤비이자 불도저 |
| Hold and Wait (점유 및 대기) | 데드락의 4가지 파국 조건 중, 2PL 프로토콜의 1단계(Growing Phase)가 가장 흉폭하게 합법화시키고 지원해 버리는 역린 요소 |
| MVCC 기법 (다중 버전 병행 제어) | 2PL이 하도 원리원칙 따지며 답답하게 다 막아서 데드락 터지니, 단순 Select 읽기 행동만이라도 이 2PL 굴레에서 락 안 잡고 숨구멍 트이게 고안된 탈옥수 꿀팁 장비 |
👶 어린이를 위한 3줄 비유 설명
- "2단계 잠금(2PL)"이라는 놀이공원 룰이 있어요! 게임기(자원 락) 한 개를 잡으면 다 놀 때까지 절대 양보 못 해요. 그리고 다른 게임기까지 계속 욕심내어 잔뜩 주워서 쌓을 동안(1단계) 자기가 움켜쥔 게임기 1개도 절대 친구에게 풀어줄 수 없어요!
- 그러니 애들 두 명이 양손 가득 딴 게임기를 안고 절대 못 푼다며 서로 으르렁 버티다가 딱 얽혀서 영원히 울음바다를 터트리는(데드락 덩어리 폭발의 취약점) 단점이 생겼답니다.
- 하지만 그래도 장난감이 남의 거랑 섞이거나 고장 나는 끔찍한 사태(데이터 정합성 파괴)를 이 룰이 가장 완벽하게 막아주기 때문에, 경찰 아저씨(OS 타임아웃)가 와서 싸움난 애들만 중간중간 퇴장시키는 방식(강제 롤백)을 얹어서라도 데이터베이스가 꼭 지키려 하는 최고의 약속이랍니다!