206. 연쇄 복귀 (Cascading Rollback) - 병행 수행 문제 연쇄 취소 의존성 오손 읽기(Dirty Read) 무결성 붕괴 회복 불가능(Unrecoverable) 스케줄
핵심 인사이트: (205번 오손 읽기 심화) 내가 덜 구워진 빵 반죽(가짜 데이터)을 훔쳐서 맛있게 먹고 나갔다(오손 읽기). 근데 이 빵이 식중독 빵이었다. 제빵사가 "야 아까 훔쳐 먹은 빵 상했어! 당장 토해내(ROLLBACK)!"라고 소리쳤다. 근데 더 끔찍한 비극이 터졌다. 나 혼자 먹은 게 아니라, 내가 빵을 훔쳐서 동생한테 먹였고, 동생은 친구한테 먹였고, 친구는 부모님한테 먹인 것이다. 제빵사 1명이 빵을 취소(ROLLBACK)하려고 했더니, 빵 반죽을 직간접적으로 주워 먹었던 수백 명의 사람들이 도미노처럼 다 같이 위세척(연쇄 ROLLBACK)을 당해야 하는 미친 대학살극이 열렸다! "야! 딴 놈이 아직 확정(COMMIT)도 안 한 찌끄러기 데이터를 훔쳐먹으면 엮여서 다 같이 죽잖아!!" 오손 읽기가 낳은 최악의 파멸 나비효과, 연쇄 복귀다.
Ⅰ. 찌끄러기를 공유한 자들의 운명 공동체
- 205번에서 남이 아직 COMMIT 하지 않은 미확정 상태의 쓰레기 데이터(Dirty Data)를 몰래 읽어가는 것을 **오손 읽기(Dirty Read)**라고 했습니다.
- 이 쓰레기를 한 놈만 주워 먹으면 그놈만 롤백하면 끝납니다.
- 하지만 DB 안에는 수만 개의 트랜잭션이 물레방아처럼 돌고 있습니다. 찌꺼기 데이터 하나가 거대한 시스템 전체를 오염시킵니다.
Ⅱ. 연쇄 복귀 (Cascading Rollback)의 대재앙 🌟
- 개념: 병행 수행 중인 여러 트랜잭션이 서로 꼬리를 물고 데이터를 주고받았을 때, 근원지 트랜잭션(T1) 하나가 오류로 인해 ROLLBACK(취소)되어버리면, T1이 만들어낸 덜 익은 임시 데이터를 꿀꺽 읽어서 사용했던 T2, T3, T4까지 모두 멱살이 잡혀 연쇄적으로 도미노처럼 강제 ROLLBACK 당해야 하는 파멸적 낭비 현상입니다.
- 오버헤드: 한 놈이 실수했는데 수백 명의 성공적인 작업 시간과 CPU 연산이 한방에 휴지조각이 되므로 시스템의 성능(Throughput)이 바닥을 칩니다.
Ⅲ. 연쇄 복귀를 뛰어넘는 진정한 지옥: 회복 불가능(Unrecoverable) 🌟 핵심 기출 🌟
연쇄 롤백이라도 당하면 그나마 다행입니다. 아예 타임머신이 부서지는 경우가 생깁니다.
시나리오 (먹고 튀어버린 놈)
- 제빵사(
T1)가 빵 반죽을 만듭니다 (데이터 UPDATE, 아직 COMMIT 안 함). - 도둑(
T2)이 그 덜 익은 반죽을 몰래 훔쳐 먹고(Dirty Read), 소화까지 다 시킨 다음에 "나 빵 완벽하게 다 먹었어! 성공(COMMIT)!!" 도장을 쾅 찍고 먼저 문을 박차고 퇴근해 버립니다. - 1초 뒤 제빵사(
T1)가 빵 반죽에 쥐약이 들어간 걸 알고 **"아씨 망했다 취소(ROLLBACK)!"**를 누릅니다. - 회복 불가능 (Unrecoverable Schedule): 제빵사
T1이 롤백되려면 그 빵을 먹은T2도 같이 연쇄 롤백되어야 시스템이 깨끗해집니다. - 하지만
T2는 이미 196번의 영속성(Durability) 도장인 'COMMIT'을 찍고 우주 밖으로 사라졌습니다! 한 번 COMMIT 된 놈은 우주가 멸망해도 롤백(취소)시킬 수 없습니다!! - 제빵사
T1은 취소되어 흔적이 사라졌는데, 훔쳐 먹은T2의 영원불멸한 성공 흔적만 DB에 남아버린 '복구 불가능한 영구적 모순(데이터 붕괴)' 상태에 빠지고 맙니다.
Ⅳ. 방어막: 연쇄 복귀 없는 스케줄 (Cascadeless Schedule) 🌟
이 지옥을 피하려면 애초에 싹을 잘라야 합니다.
- 절대 룰: "트랜잭션이 데이터에 COMMIT 도장을 완전히 꽝 찍기 전까지는, 남들이 그 데이터를 절대 읽지(Read) 못하게 차단해라!"
- 이 룰이 바로 전 세계 표준 DB들이 세팅해 둔 격리 수준인 Read Committed (커밋된 것만 읽기 허용) 입니다. 이 방패 하나로 205번 오손 읽기(Dirty Read)와 206번 연쇄 복귀(Cascading Rollback) 두 마리의 미친개를 한 번에 완벽하게 박살 내버립니다.
📢 섹션 요약 비유: **연쇄 복귀(Cascading Rollback)**는 전염병 병동에서 벌어지는 **'릴레이 바이러스 감염과 무더기 격리 사태'**입니다. 1번 환자(T1)가 아직 완치 판정(COMMIT)을 받지 않았는데, 2번 환자(T2)가 병실에 몰래 들어와 1번 환자와 악수를 합니다(오손 읽기, Dirty Read). 2번은 3번과 악수하고, 3번은 4번과 악수합니다(의존성 형성). 갑자기 의사가 들어와 1번 환자에게 "당신 치명적인 바이러스 보균자야! 당장 수술실로 다시 돌아가(ROLLBACK)!"라고 선언합니다. 그 순간, 1번과 악수했던 2번, 3번, 4번 환자 수백 명이 그동안 건강하게 밥 먹고 퇴원 준비를 하고 있었음에도 불구하고 억울하게 머리채를 잡혀 도미노처럼 다 같이 수술실로 끌려가(연쇄 취소) 시간과 돈을 미친 듯이 낭비하게 됩니다. 더 최악인 건 2번 환자가 수술실로 끌려가기 전에 이미 '퇴원 완료(COMMIT)' 도장을 찍고 집에 가버렸다면? 경찰을 풀어도 그를 병원으로 되돌릴 수 없어 마을 전체에 전염병이 퍼지는 대재앙(회복 불가능 스케줄)이 터집니다. 이 끔찍한 나비효과를 막으려면, 1번 환자가 완치 도장(COMMIT)을 받기 전까지는 절대 병실 밖으로 꺼내주지 않고 완벽히 철창을 잠가두는(Read Committed 격리) 지독한 통제가 필수적입니다.