221. 강건한 2PL (Rigorous 2PL) - 2단계 락킹 프로토콜 최상위 진화형 모든 락(S-Lock, X-Lock) 커밋 시 반납 직렬화 동시성 저하 구현 단순성

핵심 인사이트: (220번 Strict 2PL의 뇌절판) 220번 엄격한 2PL을 만들었더니 개발자들이 헷갈리기 시작했다. "어라? 뜯어고치는 무서운 X-Lock은 트랜잭션 끝(COMMIT)날 때까지 죽어라 꽉 쥐고 버티라 했고, 눈으로 쳐다보는 착한 S-Lock은 중간에 툭툭 버리고 가도 된다고 했지? 아 씨 락 종류마다 언제 놔주고 언제 잡을지 머리 쓰느라 DB 엔진 로직 짜기가 미치도록 귀찮네!!" 귀차니즘에 빠진 하드코어 관리자가 도끼를 찍으며 외쳤다. "야 ㅆㅂ!! 락 종류 따지지 마!! 구경하는 착한 S-Lock이든 뜯어고치는 무서운 X-Lock이든, 네가 한 번이라도 방에 들어가서 자물쇠를 집어 들었으면 묻지도 따지지도 말고 무조건 네가 짐 싸서 퇴근하고 문 닫는 그 마지막(COMMIT/ROLLBACK) 1초 전까지 100% 다 쥐고 버텨라!!! 중간에 자물쇠 버리는 새끼는 다 쏴 죽여!!" 구현은 유치원생도 할 만큼 미치도록 쉬워졌지만, 성능을 바닥까지 박살 내버린 무식한 독재자, 강건한 2PL이다.

Ⅰ. 220번 Strict 2PL의 애매한 관용

  • 220번 **엄격한 2PL(Strict 2PL)**은 쓰기 락(X-Lock)만 끝까지 쥐게 하고, 읽기 락(S-Lock)은 2단계 축소 룰에 따라 중간에 미리 풀 수(Unlock) 있게 놔주는 일말의 자비심이 있었습니다.
  • 덕분에 동시성(성능)은 올랐지만, DB 엔진 내부적으로 "이 락이 S냐 X냐, 지금 풀어도 되냐 마냐"를 실시간으로 스케줄링하고 계산하느라 엔진 로직이 꽤나 복잡해졌습니다.

Ⅱ. 강건한 2PL (Rigorous 2PL)의 극단적 개념 🌟

  • Rigorous (엄격한, 철저한, 가혹한)
  • 개념: Strict 2PL의 진화형(이자 단순화 버전)으로, 트랜잭션이 획득한 모든 자물쇠(공유 락 S-Lock, 배타 락 X-Lock 구별 없이 몽땅 다!)를 트랜잭션이 완벽하게 종료(COMMIT 또는 ROLLBACK)되는 그 최후의 찰나까지 100% 일괄적으로 쥐고 버티도록 강제하는 무식하고 극단적인 락킹 규약입니다.

Ⅲ. 극단주의가 낳은 빛과 핏빛 그림자 🌟 핵심 🌟

1. 완벽한 복구(Recoverability)와 직렬화 보장

  • 당연히 X-Lock을 끝까지 쥐고 있으니 220번처럼 연쇄 복귀(Cascading Rollback)와 오손 읽기(Dirty Read)는 우주에서 완벽하게 소멸합니다.
  • 이에 더해, 착한 놈인 S-Lock마저 끝까지 안 놔주기 때문에 다른 놈들이 치고 들어올 틈이 아예 물리학적으로 존재하지 않습니다. 스케줄 결과가 그저 하나의 완벽한 1열 종대(순차 실행)와 똑같아집니다.

2. 구현의 단순함 (엔진 뇌절 방지)

  • DB 엔진을 개발하는 사람 입장에서는 최고의 아키텍처입니다.
  • if (lock == X-Lock) 이런 거 계산할 필요가 1도 없습니다. 그냥 트랜잭션 도장(COMMIT) 딱 찍히는 순간 메모리에 올려둔 락 목록 싹 다 Clear() 날려버리면 끝이니까 알고리즘이 미치도록 가볍고 심플합니다.

3. 치명적 그림자: 동시성의 파멸 (가장 큰 이유) 🌟

  • 왜 현실 상용 DB(오라클, MySQL)들은 이 단순하고 좋은 놈(Rigorous)을 냅두고 복잡한 220번 놈(Strict)을 메인 뼈대로 쓸까요?
  • 재앙의 병목: 내가 책을 그냥 구경만 하려고(S-Lock) 도서관에 들어왔는데, 내가 10시간 동안 다른 책 10권을 다 읽고 도서관 문을 나갈(COMMIT) 때까지, 10시간 전에 다 읽고 내려놓은 1번째 책의 자물쇠를 안 풀어주고 독점합니다!!
  • 구경만 하는 착한 자물쇠(S-Lock)마저 쓸데없이 오래 독점하고 버티는 바람에, 뒤에서 1번째 책을 보려는 수만 명의 선량한 독자들이 폭동을 일으킵니다. 동시성(Concurrency)과 처리량(Throughput)이 수직으로 떡락하여 현대 인터넷 트래픽을 절대 감당할 수 없습니다.

Ⅳ. 2PL 3형제 최종 비교 요약 🌟 절대 암기 🌟

  1. 기본 2PL (Basic 2PL): 확장/축소 2단계만 지킴. 직렬 가능성은 보장하나, 락을 일찍 풀어 연쇄 복귀(Cascading Rollback) 지옥이 터짐.
  2. 엄격한 2PL (Strict 2PL): X-Lock(쓰기)만 끝까지 쥐고 버팀. 연쇄 복귀를 100% 막아내면서 S-Lock은 일찍 풀어줘 동시성까지 챙긴 현대 상용 DB의 최종 정답지.
  3. 강건한 2PL (Rigorous 2PL): X-Lock, S-Lock 종류 불문 싹 다 끝까지 쥐고 버팀. 구현은 개꿀이나 동시성이 개박살 나서 실무에선 버려짐.

📢 섹션 요약 비유: **강건한 2PL(Rigorous 2PL)**은 무식하고 꽉 막힌 도서관의 **'절대 독점 대여 룰'**입니다. 1번 학생(트랜잭션)이 도서관에 들어와서 수학책에 낙서(Write, X-Lock)를 하고, 국어책은 그냥 눈으로 쓱 훑어보았습니다(Read, S-Lock). 220번의 '엄격한 2PL' 사서라면 "수학책은 네가 낙서를 덜 끝냈으니 집에 갈 때까지 꽉 쥐고 있어! 근데 국어책은 다 봤으면 뒤에 애들도 보게 빨리 내려놔(S-Lock 조기 반납 허용)!" 라며 융통성을 발휘해 회전율을 높여줬습니다. 하지만 꽉 막힌 독재자 강건한 2PL 사서는 몽둥이를 들고 소리칩니다. "야! 낙서하는 수학책이든 구경 다 한 국어책이든 얄짤없어! 네가 오늘 밤에 가방 싸서 도서관 정문을 완벽하게 걸어 나가는(COMMIT) 그 순간까지, 네 손가락이 닿은 모든 책은 절대 반납 불가야!! 밥 쳐먹을 때도 꽉 안고 있어!!" 사서는 책 반납 날짜를 계산할 필요가 없어져(구현 단순) 꿀을 빨지만, 다 읽은 국어책마저 1번 학생이 10시간 동안 깔고 뭉개는 바람에, 국어책을 보려던 전교생 1만 명이 도서관 밖에서 피 터지게 대기(Wait)하다 분노로 샷타를 부숴버리는 무식한 동시성 떡락의 대명사입니다.