247. 교착 상태 탐지 대기 그래프 (Wait-for Graph) - 데드락 탐지 사이클 발견 희생자 선정 희생자 롤백 오버헤드 트랜잭션 동시성
핵심 인사이트: (데드락 예방을 포기하고 사후 처벌을 선택한 자들) "야! 246번 Wait-Die 기법으로 데드락 예방하니까 좋아? 근데 생각해 봐. 늙은 놈이 젊은 놈 락 탐낸다고 애먼 젊은 놈을 1분에 100번씩 칼로 찔러 죽여서 롤백(사형)시키잖아! 찔려 죽은 놈이 기껏 10시간 연산해 놓은 게 다 날아가서 서버 낭비가 미친 듯이 터지잖아!! 예방(Prevention)은 너무 쫄보 같고 낭비가 심해!! 당장 룰 바꿔!! 평소엔 자물쇠 뺏든 말든 막장으로 다 풀어줘(데드락 냅둬)!! 대신 경찰(DB 엔진)이 5분에 한 번씩 헬기 띄워서 도로 상황을 스캔해!! '어라? T1은 T2 기다리고, T2는 T3 기다리는데, T3가 다시 T1을 기다리면서 놈들이 둥글게 원(사이클 Cycle)을 그리고 있네?! 데드락 발견(탐지)!!' 그럼 그 동그라미 원 안에 있는 놈들 중에, 롤백시켜도 가장 피해가 적은 '제일 불쌍하고 힘없는 1놈(희생자)'만 핀셋으로 골라서 대가리를 빡 쳐서 롤백시켜버려!! 그럼 원이 툭 끊어지면서 나머지 놈들은 살아서 굴러가잖아!!" 병이 터지기 전엔 냅뒀다가, 터지면 메스로 암 덩어리 1개만 도려내어 희생시키는 탐지 및 복구(Detection & Recovery), 대기 그래프다.
Ⅰ. 예방(Prevention)의 미친 오버헤드
- 246번 예방 기법은 무조건 데드락이 안 터지게 만듭니다.
- 치명적 단점: 데드락이 1번 터질까 말까 한데, 그걸 막으려고 죄 없는 수만 개의 트랜잭션을 예방 수칙(나이표 검사)에 얽매이게 해서 시도 때도 없이 강제 롤백(사형)을 남발합니다. 롤백이 잦아지면 시스템 자원(CPU, 디스크) 낭비가 극에 달합니다.
Ⅱ. 대기 그래프 (Wait-for Graph)의 개념 🌟
- 개념: 데드락 발생을 미리 막지 않고 내버려 두다가, 시스템이 주기적으로(또는 자물쇠 대기 시간이 너무 길어질 때) 트랜잭션들이 누구의 자물쇠를 기다리고 있는지를 점과 화살표로 연결한 '대기 그래프(Wait-for Graph)'를 그려서, 그래프 내에 빙빙 도는 무한 루프 쳇바퀴(사이클 Cycle)가 발생했는지 검사하여 교착 상태(데드락)를 사후에 탐지(Detection)하는 기법입니다.
Ⅲ. 사이클(Cycle) 탐지와 핏빛 희생양 선정 🌟 핵심 기출 🌟
경찰이 헬기를 띄웠습니다. 둥글게 꼬여서 멈춰있는 놈들을 찾았습니다. 이제 어떻게 꼬인 걸 풀까요?
1. 사이클(Cycle) 쳇바퀴의 발견
T1➜ (화살표) ➜T2➜T3➜T1- 화살표 꼬리를 물고 내게 다시 돌아오는 원(Cycle)이 그려졌습니다. 이 3명은 영원히 서로의 자물쇠를 기다리며 멈춰있는 100% 데드락 상태임이 증명되었습니다.
2. 희생자 (Victim) 선정의 잔혹한 철학 🌟 (누구를 죽일 것인가?)
- 3명 다 죽이면 시스템 낭비입니다. 1명만 죽여서 원의 연결 고리를 끊어내면 나머지 2명은 락을 얻고 살아납니다.
- 희생자 타겟 1순위 (가장 만만한 놈):
- 가장 최근에 들어온 젊은 놈 (나이가 어린 놈): 이제 막 일 시작한 놈을 죽이는 게 아깝지 않습니다.
- 지금까지 연산을 가장 적게 한 놈 (진도가 안 나간 놈): 고작 10줄 쿼리 친 놈을 죽이지, 1만 줄 쿼리 쳐놓은 놈을 롤백시키면 낭비가 개심합니다.
- 쥐고 있는 자물쇠(Lock)가 가장 적은 놈: 죽였을 때 시스템에 미치는 타격이 적습니다.
3. 기아 상태 (Starvation)의 함정
- DB 엔진이 가장 만만한
T3를 희생양으로 뽑아 대가리를 쳐서 강제 롤백시켰습니다! - 1시간 뒤
T3가 다시 켜졌습니다. 또 데드락에 걸렸습니다. 엔진이 스캔하더니 "어? 또 네가 젤 만만하네? 또 뒈져!" 무한 롤백을 때립니다. - 억울한
T3는 평생 계산을 못 끝내고 굶어 죽습니다(Starvation). 이를 막기 위해 **"한 번 롤백 당할 때마다 나이를 먹여서(우선순위 펌핑), 다음번엔 희생자로 안 찍히게 무적 방패를 씌워주는 보정 로직"**이 필수적으로 들어갑니다.
Ⅳ. 예방(Prevention) vs 탐지(Detection)의 트레이드오프
- 오라클(Oracle) 등 대부분의 대형 상용 DB는 246번 쫄보 예방 기법 대신, 이 **247번 쿨가이 탐지 기법(대기 그래프)**을 기본 뼈대로 사용합니다.
- "데드락 어쩌다 1번 터지는 거 막으려고 99번 죄 없는 애들 죽이느니, 그냥 방목하다가 터지면 그때 가서 희생양 1명만 핀셋으로 뽑아 죽이는 게 가성비(성능)가 압도적으로 좋기 때문"입니다.
📢 섹션 요약 비유: 대기 그래프(Wait-for Graph)와 탐지는 혼잡한 교차로의 '헬기 스캔과 핀셋 견인' 교통 통제술입니다. 옛날(데드락 예방)엔 교차로 진입 전에 차들을 일일이 세우고 나이를 검사해서, 꼬일 것 같으면 차를 부숴버렸습니다(낭비 심함). 현대 교차로(탐지 기법)는 신호등 없이 차들을 일단 교차로 한가운데로 다 밀어 넣습니다(자유 방임). 차들이 서로 양보 안 하다가 4대가 '우물 정(井)' 모양으로 꼬여서 교차로가 꽉 막혀버렸습니다(데드락 사이클 발생). 관제탑(DB 엔진)이 드론을 띄워 이 꼬인 '우물 정' 모양을 위에서 사진으로 찍어냅니다(대기 그래프 탐지). 이제 차를 뺍니다. 4대의 차 중 누굴 부숴서 치울까요(희생자 선정)? 10톤짜리 덤프트럭(계산 엄청 많이 한 트랜잭션)을 치우려면 돈이 너무 많이 드니까 냅둡니다. 방금 막 교차로에 대가리만 살짝 밀어 넣은 **'조그만 오토바이 1대(연산량이 가장 적고 늦게 온 희생양)'**를 크레인으로 핀셋 짚듯 딱 집어서 교차로 밖으로 강제로 던져버립니다(희생양 롤백). 1대만 치워주면 얽혀있던 꼬리물기가 풀리면서 나머지 3대의 트럭은 쌩쌩 교차로를 빠져나갑니다. 오토바이 주인은 억울하지만, 전체 교통망(DB 시스템)의 흐름을 지키기 위해 최소한의 희생으로 최대의 효율을 뽑아내는 가장 현실적인 데드락 사후 처리반입니다.