216. 2단계 락킹 프로토콜 (2PL, Two-Phase Locking) - 직렬 가능성 보장 락 확장 단계 축소 단계 데드락 연쇄 복귀 한계점 트랜잭션 동시성 제어

핵심 인사이트: (211, 212번의 궁극적 정답지) 213번에서 자물쇠(Lock)를 배웠다. 근데 개발자 철수가 미쳐서 코드 한 줄 칠 때마다 "A 락 걸기 ➜ A 풀기 ➜ B 락 걸기 ➜ B 풀기 ➜ 다시 A 락 걸기" 식으로 자물쇠를 정신병자처럼 열었다 풀었다 막 섞어 썼다. 그 틈새로 해커가 비집고 들어와 데이터를 쑥대밭으로 만들고 모순성(직렬 가능성 박살) 에러가 펑펑 터졌다. 학자들이 분노했다. "야 ㅆㅂ!! 네 마음대로 자물쇠를 열었다 풀었다 촐랑대지 마!! 자물쇠 통제에도 '군대식 각개전투 2단계' 절대 규칙을 법으로 박아주마!! 1단계(확장): 방에 들어갈 땐 미친 듯이 필요한 자물쇠를 다 쓸어 모으기만(Lock) 해! 단 1개라도 자물쇠를 바닥에 버리는 순간(Unlock), 넌 즉시 2단계(축소)로 강제 진입당한다! 2단계: 이때부턴 가진 자물쇠를 하나씩 풀고 버리기만 해! 절대 맹세코 단 한 개의 새로운 자물쇠(Lock)도 다시는 쥘 수 없다!!" 이 2단계 강제 법규(2PL)만 지키면, 신기하게도 수학적으로 무조건 100% 에러 안 나는 '직렬 가능 스케줄(안전빵)'만 튀어나온다!

Ⅰ. 자물쇠 촐랑거림의 비극 (직렬 가능성 파괴)

  • 트랜잭션이 아무런 룰 없이 Lock(A)Unlock(A)Lock(B)Unlock(B) 순서로 제멋대로 자물쇠를 걸고 풀면, A의 자물쇠를 푼 그 찰나의 빈틈에 딴 놈이 쏜살같이 튀어 들어와 A의 값을 훼손합니다.
  • 결과적으로 211번에서 그토록 원했던 '충돌 직렬 가능 스케줄(안전빵 시간표)'의 사이클 검사를 통과하지 못하고 데이터가 박살 나는 쓰레기 스케줄이 되어버립니다.

Ⅱ. 2단계 락킹 프로토콜 (2PL)의 개념 🌟

  • 개념: 시스템의 모든 트랜잭션이 자물쇠를 획득(Lock)하고 반납(Unlock)하는 행위를 뒤죽박죽 섞어서 하지 못하도록, 오직 락을 모으기만 하는 '확장(Growing) 단계'와 락을 버리기만 하는 '축소(Shrinking) 단계', 두 개의 명확하게 분리된 시간적 페이즈(Phase)로 나누어 실행할 것을 강제하는 락킹 규약입니다.
  • 존재 이유 (절대 명제) 🌟 기출: 이 2PL 규약만 똑바로 지키면, 그 결과로 나오는 병행 짬뽕 시간표(스케줄)는 아무런 수학적 검증 없이도 무조건 100% 직렬 가능 스케줄(Serializable, 에러 없는 완벽한 스케줄)이 됨을 수학적으로 보장받습니다. 전 세계 상용 DB가 이 프로토콜을 뼈대로 삼는 이유입니다.

Ⅲ. 2PL을 지배하는 2개의 시간표 페이즈 🌟 핵심 기출 🌟

오르막길이 끝나야 내리막길이 시작됩니다.

1. 확장 단계 (Growing Phase) - "블랙홀처럼 집어삼키기"

  • 트랜잭션이 시작되고 처음 진입하는 1단계입니다.
  • 이 단계에서 트랜잭션은 자신이 필요한 모든 자물쇠(S-Lock, X-Lock)를 미친 듯이 시스템으로부터 획득(Lock)하고 끌어모으는 것만 가능합니다.
  • 절대 룰: 이 1단계에서는 자신이 이미 손에 쥔 자물쇠를 단 1개라도 절대 바닥에 던져서 풀 수(Unlock) 없습니다. 풀면 바로 2단계로 쫓겨납니다.

2. 축소 단계 (Shrinking Phase) - "하나씩 버리고 떠나기"

  • 트랜잭션이 드디어 손에 쥔 수많은 자물쇠 중 '처음으로 딱 1개의 자물쇠를 푼(Unlock) 그 찰나의 순간!' 트랜잭션은 자동으로 확장 단계를 종료하고 이 2단계(축소 단계)로 강제 진입(Lock Point 도달)하게 됩니다.
  • 절대 룰: 축소 단계에 진입한 트랜잭션은 이제부터 가진 자물쇠를 하나씩 풀어서 반납(Unlock)하는 것만 가능합니다. 아차! 하고 실수로 까먹은 새로운 자물쇠가 필요해져도 새로운 락(Lock)을 획득하는 것은 우주가 폭발해도 영원히 절대 불가능합니다.

Ⅳ. 2PL의 핏빛 한계점 2가지 🌟 기출 단골 🌟

직렬 가능성(안전빵)은 완벽히 보장해 주지만, 세상에 완벽한 무기는 없습니다.

1. 교착 상태 (Deadlock) 발생 🌟

  • 2PL은 "풀기 전까진 모으기만 해라"라는 룰 때문에 데드락(서로의 목을 조르고 영원히 멈추는 현상)에 미치도록 취약합니다.
  • T1이 A락을 쥐고 확장 단계 중인데 B락이 필요합니다. T2는 B락을 쥐고 확장 단계 중인데 A락이 필요합니다. 둘 다 "풀 수 없는 1단계"에 있으므로 평생 서로의 락을 기다리다 시스템 전체가 먹통이 되는 데드락(교착상태)을 원천적으로 막지 못하는 치명적 구멍이 있습니다.

2. 연쇄 복귀 (Cascading Rollback)의 위험 🌟

  • T1이 축소 단계에 접어들어 A락을 살짝 풀었습니다(Unlock). 하지만 아직 T1 자체는 완전히 끝난(COMMIT) 게 아닙니다.
  • A락이 풀린 걸 보고 신난 T2가 득달같이 달려와 A락을 줍고 A데이터를 읽었습니다(오손 읽기).
  • 근데 1초 뒤 T1이 에러가 나서 뒤늦게 ROLLBACK(취소) 되어버렸습니다.
  • 그 찰나의 빈틈에 락을 주워 먹었던 T2, T3까지 모조리 다 도미노처럼 같이 롤백되어버리는 206번 연쇄 복귀(Cascading Rollback) 재앙을 2PL 기본형으로는 막아내지 못합니다. (이걸 막기 위해 X-Lock을 트랜잭션이 100% COMMIT 될 때까지 절대 안 풀고 꽉 쥐고 있는 '엄격한(Strict) 2PL' 진화형이 등장하게 됩니다.)

📢 섹션 요약 비유: **2단계 락킹 프로토콜(2PL)**은 마트에서 뷔페 음식을 털어가는 **'이기적인 식판 룰'**입니다. 마트 관리자(DB 엔진)가 음식(데이터)이 섞여서 오염되는 걸 막기 위해 절대 법규를 세웠습니다. 1단계(확장 단계): 손님(트랜잭션)은 카트(트랜잭션 공간)를 끌고 매장을 돌며 자기가 요리할 때 필요한 '고기 락, 야채 락, 양념 락' 등 모든 재료의 자물쇠를 카트에 미친 듯이 끌어 담기(Lock 획득)만 해야 합니다. 카트에 담은 걸 중간에 하나라도 다시 진열대에 툭 던져서 내려놓는 순간(Unlock 시도), 경비원이 나타나 호루라기를 불며 "어?! 너 하나 버렸지? 넌 이제 1단계 끝났어! 2단계로 넘어가!"라고 강제 전환시킵니다. 2단계(축소 단계): 이때부터 손님은 카트에 담은 자물쇠를 하나씩 진열대에 반납(Unlock)하는 것만 허락됩니다. 가다가 "아차, 소금 락을 깜빡했네!" 하고 소금 락을 새로 집으려(Lock 획득 시도) 해도, 경비원이 몽둥이로 때리며 "넌 이미 반납(축소) 단계에 접어들었어! 새로운 재료(Lock) 추가 획득은 영원히 불가능하다!!" 라며 철통같이 막아냅니다. 중간에 촐랑대며 잡았다 놨다 하는 빈틈을 완전히 박살 내버리기 때문에, 뒤따라오는 손님과 재료가 섞이는 에러(데이터 모순)가 수학적으로 100% 완벽하게 차단되어 궁극의 '직렬 가능 스케줄'이라는 안전한 평화를 강제로 쟁취해 내는 DB의 핵심 통제 헌법입니다.