197. 트랜잭션 상태 전이 - 활동(Active) 부분 완료(Partially Committed) 완료(Committed) 실패(Failed) 철회(Aborted) 데이터베이스 동작 흐름

핵심 인사이트: (193번, 196번의 집대성) 트랜잭션(송금)은 버튼 누른다고 0.1초 만에 뿅 하고 성공하는 게 아니다. 내부를 뜯어보면 철수 계좌 읽고 ➜ 빼고 ➜ 영희 계좌 읽고 ➜ 더하고 ➜ 디스크에 저장하는 험난한 여행길이다. 이 여행길에서 트랜잭션은 살아서 영광의 도장을 찍느냐, 가다 쓰러져 비참하게 뒤지느냐 5가지 상태로 계속 얼굴(상태)이 바뀐다. "야! 수술 중일 때(Active), 꼬매는 것까지 다 끝나고 마지막 의사 사인만 남았을 때(Partially Committed), 완벽히 퇴원할 때(Committed), 수술하다 피 터졌을 때(Failed), 타임머신 타고 입원 전으로 쫓겨날 때(Aborted)의 5가지 얼굴표정(상태 전이도)을 머릿속에 완벽하게 박아 넣어라!" 트랜잭션의 탄생과 죽음을 보여주는 절대 지도, 상태 전이도다.

Ⅰ. 트랜잭션의 생애 주기 (Life Cycle)

트랜잭션이 시작(BEGIN)되어 끝날 때까지 겪는 5가지 상태의 변화 과정입니다. 정보처리기사/감리사 객관식, 서술형 단골로 나오는 그 유명한 다이어그램입니다.

Ⅱ. 5가지 핵심 상태 완벽 해부 🌟 핵심 기출 🌟

1. 활동 (Active) - "수술실에서 배 가르고 수술 중!"

  • 트랜잭션이 시작(BEGIN)되어 현재 쿼리(연산)들이 데이터베이스 메모리(RAM) 위에서 미친 듯이 실행되고 있는(돌아가고 있는) 시퍼렇게 살아 숨 쉬는 상태입니다.
  • 아직 디스크에 저장도 안 됐고 승인도 안 떨어진 가장 아슬아슬한 줄타기 상태입니다.

2. 부분 완료 (Partially Committed) - "수술 끝! 교수님 결재만 남음!" 🌟 가장 헷갈림 🌟

  • 트랜잭션이 계획한 5개의 UPDATE 쿼리(마지막 연산)를 메모리(RAM) 상에서는 100% 완벽하게 다 끝내고 성공적으로 수행을 마친 직후의 찰나의 상태입니다.
  • 하지만!! 아직 196번에서 배운 영속성(Durability)을 위한 '최종 COMMIT(디스크 영구 저장)' 도장을 쾅 찍기 바로 직전인 아슬아슬한 대기 상태입니다.
  • 이 상태에서 전원 케이블이 뽑히면 아직 완전한 성공이 아니기 때문에 얄짤없이 실패(Failed)로 굴러떨어집니다.

3. 완료 (Committed) - "축하합니다 완치입니다! 영원히 보존됨!"

  • 부분 완료 상태에서 무사히 디스크에 로그와 데이터가 영구적으로 박히고(Flush), 데이터베이스가 공식적으로 "모든 연산이 성공적으로 완수되었다(COMMIT)!"라고 선언한 최후의 평화로운 종착지 상태입니다.
  • 이 단계에 도달하면 196번의 영속성이 부여되어, 지구가 멸망해도 결과는 절대 번복(취소)될 수 없는 신의 영역에 들어섭니다.

4. 실패 (Failed) - "삐-삐-삐- 환자 바이탈 떨어집니다!"

  • 트랜잭션을 열심히 활동(Active) 중이거나, 교수님 결재를 기다리는(Partially Committed) 도중에 갑자기 정전이 나거나, 문법 에러(SQL 오타)가 나거나, 데드락이 걸려 더 이상 작업을 진행할 수 없는 끔찍한 치명상을 입은 중단 상태입니다.
  • 실패 판정을 받으면 트랜잭션은 즉시 193번의 원자성(Atomicity)을 수호하기 위해 타임머신을 타러(ROLLBACK) 끌려갑니다.

5. 철회 / 에보트 (Aborted) - "타임머신 타고 과거로 부활!"

  • 실패(Failed) 판정을 받은 놈을 '회복 관리자(Recovery Manager)'가 멱살 잡고 끌고 가서, UNDO 로그를 뒤져 에러 나기 전 과거 시점(트랜잭션 시작 이전)으로 100% 완벽하게 상태를 원상 복구(ROLLBACK)시켜버린 뒤, 시스템에서 완전히 강제 종료되어 쫓겨난 상태입니다. (무효화 처리 완료)
  • 이 쫓겨난 놈은 아예 처음부터 다시 시작(Restart)하거나, 그냥 영원히 죽여(Kill) 버립니다.

Ⅲ. 상태 전이도의 흐름 한눈에 보기

  1. Active ➜ (연산 다 끝남) ➜ Partially Committed ➜ (디스크 저장 도장 쾅) ➜ Committed (해피 엔딩)
  2. Active ➜ (중간에 에러 펑!) ➜ Failed ➜ (과거로 되돌림) ➜ Aborted (배드 엔딩)
  3. Partially Committed ➜ (도장 찍기 직전에 정전 펑!) ➜ Failed ➜ (과거로 되돌림) ➜ Aborted (제일 억울한 배드 엔딩)

📢 섹션 요약 비유: 트랜잭션의 상태 변화는 **'레스토랑에서 스테이크를 주문해서 먹고 나오는 완벽한 시나리오'**입니다. 내가 주문을 넣고 주방장이 고기를 굽고 지지고 볶고 있는 치열한 상태가 **활동(Active)**입니다. 셰프가 마침내 고기를 완벽하게 다 굽고 접시에 담아 내 테이블 위로 가져온 찰나의 순간이 **부분 완료(Partially Committed)**입니다(요리는 끝났으나 아직 내가 포크를 안 들었음). 내가 고기를 맛있게 다 씹어 먹고 영수증에 '결제(COMMIT)' 사인을 하면 비로소 완료(Committed) 상태로 영원히 배부른 승리자가 됩니다. 그런데, 고기를 굽는 중(Active)에 가스가 끊겨 불이 꺼지거나, 내 테이블에 접시가 놓인 찰나(Partially Committed)에 천장에서 쥐가 접시로 떨어져 버리면 요리를 망친 실패(Failed) 상태가 됩니다. 레스토랑 지배인(회복 관리자)은 실패를 감지하는 즉시 쥐가 빠진 스테이크를 휴지통에 던져버리고 내 테이블을 치운 뒤(ROLLBACK), "고객님 정말 죄송합니다, 아예 처음부터 주문 다시 받을게요" 라며 주문 전 빈 테이블 상태로 시간을 돌려버려 쫓아내는 것이 철회(Aborted) 상태입니다.