199. ROLLBACK 명령어 - 트랜잭션 취소 회복 관리자 이전 상태 복구 타임머신 UNDO 연산 원자성 보장 비정상 종료 트랜잭션 롤백

핵심 인사이트: (198번 COMMIT의 반대) 게시판에 글을 올리는데 첨부파일이 너무 커서 서버가 10초간 버벅댔다. 중간에 사진 2장은 들어갔는데 마지막 사진에서 "메모리 부족 에러!"가 뜨며 뻗어버렸다. 끔찍하다. 사진 2장만 들어간 반쪽짜리 게시물(쓰레기 데이터)이 게시판을 영원히 더럽히게 생겼다. "야!! 똥 싸다 만 상태로 DB에 찌꺼기 남기지 마! 에러가 난 즉시 'ROLLBACK' 버튼을 쾅 쳐서 발동시켜!! 그럼 DB 엔진의 회복 관리자가 튀어나와서, 방금 저장된 사진 2장을 갈기갈기 찢어 지워버리고(UNDO), 네가 처음 첨부파일 버튼을 누르기 직전의 깨끗했던 10초 전 과거 시점으로 완벽하게 100% 타임머신을 돌려주잖아!!" 에러 난 찌꺼기를 흔적도 없이 증발시키는 데이터베이스의 마법의 되감기 버튼, ROLLBACK이다.

Ⅰ. 에러의 폭풍: 찌꺼기 데이터의 재앙

  • 트랜잭션 안의 수십 개 쿼리를 돌리다가 중간에 무결성 제약조건 위반(예: 잔고가 마이너스 됨), 하드웨어 오류, 데드락(교착 상태) 등이 터집니다.
  • 메모리(버퍼 캐시)나 일부 디스크에는 1번 쿼리와 2번 쿼리가 싼 배설물(잘못 변경된 데이터)이 덕지덕지 묻어 있는 모순된 상태(Inconsistency)가 됩니다. 이걸 살려두면 193번의 원자성(Atomicity, 모 아니면 도) 헌법이 박살 납니다.

Ⅱ. ROLLBACK 명령어의 개념 🌟

  • 개념: 트랜잭션이 성공적으로 완수되지 못하고 실패(Failed)했거나, 개발자가 "아차 실수했다!"며 수동으로 명령을 내렸을 때, **지금까지 트랜잭션이 부분적으로 지지고 볶으며 바꿔놓은 모든 데이터의 변경 내역을 100% 무효화(취소)시키고, 트랜잭션이 시작(BEGIN)되기 전의 완벽히 깨끗했던 원본 상태로 데이터베이스를 원상 복구(Restoration)시키는 제어어(TCL)**입니다.

Ⅲ. ROLLBACK의 3대 타임머신 부활 아키텍처 🌟 핵심 기출 🌟

과거의 깨끗했던 기억을 어떻게 되살릴까요?

1. Undo 로그 (일기장의 마법) 🌟

시간을 돌리는 핵심 코어 부품입니다.

  • 트랜잭션이 데이터를 100 ➜ 50으로 깎을 때(UPDATE), DB는 변경하기 0.1초 전에 무조건 **Undo Log(또는 Rollback Segment)**라는 특수한 일기장에 **'원래 과거 값 100(Before Image)'**을 미친 듯이 꼼꼼하게 다 적어놓고 백업해 둡니다.
  • 에러가 터져서 ROLLBACK이 호출되면, 회복 관리자가 이 Undo Log 일기장을 거꾸로 펼칩니다.
  • "아, 아까 100을 50으로 바꿨네? 그럼 로그에 적힌 100을 다시 꺼내서 덮어씌워!" 라며 수행했던 연산을 거꾸로 역연산(UNDO) 해버리면서 찰나에 과거 시점으로 강제 타임머신을 돌려버립니다.

2. Cascading Rollback (연쇄 복귀의 비극)

195번 격리성(Isolation)을 똑바로 안 지키면 일어나는 지옥입니다.

  • 트랜잭션 A가 데이터를 수정(아직 COMMIT 안 함)했는데, 트랜잭션 B가 룰을 무시하고 그 미확정 데이터를 훔쳐 가서 꿀꺽 계산에 써버렸습니다(오손 읽기, Dirty Read).
  • 1초 뒤 A가 에러 나서 펑 터지고 ROLLBACK 되었습니다.
  • 연쇄 지옥: A의 데이터가 과거로 돌아가 버렸으니, 그 똥 데이터를 주워 먹고 일하던 B도, B의 데이터를 주워 먹은 C도 **도미노처럼 줄줄이 다 같이 멱살 잡혀 과거로 롤백당해 취소되어버리는 끔찍한 대학살 현상(연쇄 복귀)**이 일어납니다.

3. 암묵적 (Implicit) 롤백

내가 타자 치지 않아도 시스템이 스스로 타임머신을 누를 때가 있습니다.

  • 데드락 (교착 상태, Deadlock): A와 B 트랜잭션이 서로의 멱살(자물쇠)을 잡고 5초 동안 가만히 서 있습니다. DBMS 백그라운드 스레드가 이를 감지하고 분노하여, 둘 중 하나(희생양)를 골라 강제로 목을 따버리고 강제 ROLLBACK을 시켜버려 교통 체증을 풀어냅니다.
  • 세션 튕김: 개발자가 DBeaver로 UPDATE 100줄 날리다가 실수로 X 버튼 눌러서 툴을 꺼버리면(세션 비정상 종료), DB는 "이놈 COMMIT 안 하고 죽었네?" 라며 즉시 롤백을 때려 허공에 뜬 찌꺼기들을 다 청소합니다.

Ⅳ. COMMIT(198번)과의 돌이킬 수 없는 강

  • 명심하십시오. 198번 COMMIT 도장이 한 번이라도 쾅 찍히고 나면, 그 뒤로는 전 세계 해커가 와도 ROLLBACK 명령어로 시간을 되돌릴 수 없습니다.
  • COMMIT 이후에 과거로 가려면, DBA가 울면서 전날 밤에 백업해 둔 덤프 파일(.bak)로 DB 전체를 폭파하고 다시 엎어치는 미친 복구(Restore) 노가다를 뛰어야 합니다.

📢 섹션 요약 비유: ROLLBACK(롤백) 명령어는 문서 작업(트랜잭션) 중의 **'만능 실행 취소 버튼 (Ctrl + Z)'**입니다. 내가 엑셀에 보고서를 100장 썼습니다(연산 중). 99장까지 기가 막히게 썼는데, 100장째에 실수로 키보드에 커피를 쏟아 엑셀에 외계어(에러)가 1만 개 타이핑되었습니다. 보고서가 완전히 오염되어 쓰레기(부분 완료 실패)가 되었습니다. 이때 백스페이스를 1만 번 누르며 눈물을 흘릴 필요가 없습니다. 그냥 단 한 번, 'ROLLBACK (Ctrl + Z)' 버튼을 누르면 끝입니다. 엑셀의 히스토리 버퍼(Undo Log)가 작동하면서, 1초 만에 쏟은 커피 자국과 외계어 1만 개가 싹 다 삭제되고, 아예 내가 보고서를 맨 처음 켜서 "제목:"을 치기 직전의 순백의 깨끗한 하얀 종이(원자성 100% 복구 상태)로 모니터를 단숨에 되돌려놓습니다. 내가 싼 똥(중간 에러)을 우주의 역사에서 단 1비트의 흔적도 남기지 않고 완벽하게 세탁하여 시스템의 무결성을 수호하는 궁극의 타임머신 마법입니다.