246. 데이터베이스 교착 상태 (Deadlock) 처리 기법 - Wait-Die Wound-Wait 타임스탬프 선점 비선점 트랜잭션 동시성 제어 예방

핵심 인사이트: (219번 데드락의 공포를 무찌르는 수학적 암살술) "야! 216번 2단계 락킹(2PL) 쓰면 자물쇠를 안 풀어줘서 서로 멱살 잡고 평생 멈추는 데드락(Deadlock)이 100% 터진다고 했지?! 그럼 교착상태 터졌을 때 어떻게 풀래? 엉킨 놈들 중에 한 놈을 몽둥이로 때려죽여서 강제 롤백시켜야지! 근데 '누구'를 죽일 건데?! 힘센 놈? 무작위? 아니야!! DB 엔진은 늙어 빠진 '할아버지 트랜잭션(먼저 켜진 놈)'과 핏덩이 '젊은 트랜잭션(늦게 켜진 놈)'의 등판에 붙은 나이표(타임스탬프)를 딱 보고 피도 눈물도 없이 둘 중 하나를 암살해!! '야 늙은아, 네가 늦게 온 핏덩이의 자물쇠를 뺏으려 해? 그럼 넌 얌전히 기다리거나(Wait), 아니면 핏덩이 칼로 찔러서 강제 뺏어(Wound)! 반대로 핏덩이 네가 감히 늙은이 자물쇠를 탐내?! 그럼 넌 그 자리에서 즉시 할복자살해서 뒈져라(Die)!!' 나이(시간표) 하나로 데드락의 싹을 무자비하게 잘라버리는 2대 예방 기법, Wait-Die와 Wound-Wait다."

Ⅰ. 영원한 멈춤, 교착 상태(Deadlock)의 도래

  • T1은 A락을 쥐고 B락을 원합니다. T2는 B락을 쥐고 A락을 원합니다.
  • 둘 다 자물쇠를 안 놓으므로 영원히 대기 상태에 빠져 서버가 먹통이 됩니다. 운영체제(OS)에서 배우는 데드락과 100% 똑같습니다.
  • DB는 이 미친 엉킴을 **미리 예방(Prevention)**하기 위해 트랜잭션의 '나이(Timestamp)'를 기준으로 암살 룰을 정해뒀습니다.

Ⅱ. 나이(Timestamp)의 철칙: 늙은 놈이 깡패다 🌟

  • 트랜잭션이 DB에 접속한 순간의 시간이 빠를수록(예: 10시 정각) **'나이가 많은 늙은 트랜잭션(Older)'**입니다.
  • 10시 5분에 늦게 들어온 놈은 **'나이가 적은 젊은 트랜잭션(Younger)'**입니다.
  • 기본 철학: "DB 엔진은 나이가 많은 늙은 트랜잭션을 무조건 우대하고 존중한다." (늙은 놈이 그동안 일해놓은 게 아까우니까 롤백 시키기 빡셉니다.)

Ⅲ. 2대 데드락 예방(Prevention) 기법 🌟 핵심 기출 🌟

"자물쇠를 내놔라!"라고 요구하는 놈의 나이에 따라 행동 지침이 정해져 있습니다. (이름을 직역하면 외우기 쉽습니다.)

1. Wait-Die (기다리거나 - 뒈지거나) 🌟 비선점(Non-preemptive)

자물쇠를 뺏는 폭력은 쓰지 않는 얌전한 방식입니다.

  • 상황 A (늙은 놈이 ➜ 젊은 놈 락을 요구함):
    • 늙은 놈(T1)은 품격이 있습니다. 자물쇠를 강제로 뺏지 않고, 젊은 놈(T2)이 다 쓰고 락을 풀 때까지 팔짱을 끼고 점잖게 기다립니다 (Wait).
  • 상황 B (젊은 놈이 ➜ 늙은 놈 락을 요구함):
    • 핏덩이(T2)가 감히 늙은 놈(T1)이 쥐고 있는 락을 내놓으라고 깐족댑니다.
    • DB 엔진이 철퇴를 내립니다! "감히 젊은 놈이 늙은이를 기다려?! 너 사형!" 젊은 놈은 그 자리에서 강제 롤백당해 암살되어 죽습니다 (Die). (그리고 1시간 뒤 똑같은 나이표를 달고 부활해서 다시 덤빕니다.)

2. Wound-Wait (상처입히거나 - 기다리거나) 🌟 선점(Preemptive)

늙은 놈이 무자비한 깡패가 되는 폭력적인 방식입니다.

  • 상황 A (늙은 놈이 ➜ 젊은 놈 락을 요구함) 🌟 하이라이트:
    • 늙은 놈(T1)이 깡패로 돌변합니다. "야 젊은 놈아, 내가 급하니까 네가 쥐고 있는 락 당장 내놔!"
    • 젊은 놈(T2)의 배때기에 칼을 꽂아 치명상을 입혀 강제로 롤백(사형)시켜 버리고, 젊은 놈이 쥐고 있던 락을 강제로 뺏어버립니다 (Wound 상처입히다 / 선점).
  • 상황 B (젊은 놈이 ➜ 늙은 놈 락을 요구함):
    • 핏덩이(T2)가 늙은 놈(T1)의 락을 원합니다. 하지만 핏덩이는 힘이 없어서 늙은이를 찌르지 못합니다.
    • 핏덩이는 늙은 놈이 락을 다 쓰고 풀어서 던져줄 때까지 쭈그려 앉아 조용히 기다립니다 (Wait).

Ⅳ. 요약 팁 (어떻게 외울까?)

단어의 앞부분(Wait, Wound)은 무조건 **"늙은 놈이 젊은 놈 걸 뺏을 때 하는 행동"**입니다.

  • Wait-Die: 늙은 놈이 점잖게 기다린다(Wait).
  • Wound-Wait: 늙은 놈이 깡패처럼 칼로 찔러 뺏는다(Wound). 이 두 가지 무식한 룰 덕분에, 트랜잭션들이 둥글게 원을 그리며 서로를 무한정 기다리는 데드락 사이클(Cycle)이 애초에 물리학적으로 형성될 수 없게 싹을 댕강 잘라버립니다.

📢 섹션 요약 비유: **데드락 예방 기법(Wait-Die / Wound-Wait)**은 조폭 세계의 '나이(짬바) 기반 화장실 독점 룰'입니다. 조폭 두목(늙은 트랜잭션 Older)과 신입 꼬봉(젊은 트랜잭션 Younger)이 화장실(데이터 락 Lock) 1칸을 두고 눈치싸움을 합니다. [Wait-Die 룰 (비선점 얌전파)]: 꼬봉이 화장실 안에 있는데 두목이 화장실을 쓰고 싶습니다. 점잖은 두목은 밖에서 헛기침하며 꼬봉이 똥 다 싸고 나올 때까지 조용히 기다립니다(Wait). 반대로 두목이 화장실 안에 있는데 꼬봉이 밖에서 "형님 똥 빨리 싸요!"라고 문을 두드리면? 건방진 꼬봉은 몽둥이를 맞고 강제로 기절하여 병원에 실려갑니다(Die 강제 롤백). [Wound-Wait 룰 (선점 깡패파)]: 꼬봉이 화장실 안에 있는데 급해진 두목이 옵니다. 두목은 자비 없이 꼬봉의 화장실 문을 발로 걷어차 부수고(Wound 상처 입힘 / 강제 롤백 뺏기), 꼬봉을 바지에 똥을 싼 채 밖으로 던져버리고 자기가 변기를 강탈해(선점) 씁니다. 반대로 두목이 똥을 싸고 있는데 꼬봉이 급하면? 꼬봉은 두목을 때릴 힘이 없으니 두목이 나올 때까지 밖에서 바지를 잡고 벌벌 떨며 기다립니다(Wait). 어떤 룰을 쓰든, 나이표(타임스탬프)라는 절대 권력 서열 덕분에 하극상으로 인한 무한 대치(서로가 서로를 영원히 기다리는 데드락)가 생기지 않고 한 놈이 죽거나 양보함으로써 화장실 회전율이 강제로 뚫리게 되는 폭력적인 예방 철학입니다.