441. 원자성 (Atomicity)과 회복 보장

⚠️ 이 문서는 트랜잭션의 4대 특성(ACID) 중 첫 번째 글자인 A(원자성)에 대한 내용으로, "모두 다 하든지, 아니면 아예 시작도 하지 말든지"라는 극단적인 흑백 논리를 통해 데이터베이스가 에러 발생 시 시간을 되돌려주는 '회복(Recovery)' 기술을 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: 트랜잭션 내의 모든 연산은 부분적으로만 성공할 수 없으며, 마치 더 이상 쪼개지지 않는 원자(Atom)처럼 하나의 단일 작업 단위로 완벽하게 처리되어야 한다.
  2. 위반 상황: 이체 과정 중 내 돈은 빠져나갔는데, 친구에게 돈이 들어가기 직전에 서버가 꺼지면 원자성이 깨진 것이다.
  3. 보장 기법: 데이터베이스 엔진은 이 상황을 수습하기 위해 **'회복(Recovery) 시스템'**을 가동하며, 이를 위해 사전에 작성해 둔 **'Undo Log(언두 로그)'**를 보고 변경된 데이터를 과거로 되돌린다(Rollback).

Ⅰ. 개요: 우주로 증발한 내 돈 1만 원 (Context & Necessity)

은행에서 '계좌 이체'를 처리하는 2줄의 SQL 코드가 있다.

  1. UPDATE 계좌 SET 잔액 = 잔액 - 10000 WHERE 이름 = '나';
  2. UPDATE 계좌 SET 잔액 = 잔액 + 10000 WHERE 이름 = '친구';

1번 쿼리가 실행되어 내 잔고가 1만 원 줄어들었다. 그런데 2번 쿼리를 실행하려는 찰나, 데이터베이스 서버의 전원 코드가 뽑혀버렸다. 서버를 다시 켰더니 내 돈 1만 원은 어디에도 없고 우주로 증발해 버렸다. **원자성(Atomicity)**이 박살 난 것이다.

데이터베이스는 이런 억울한 일을 막기 위해 **"둘 다 성공(Commit)하지 못할 거라면, 아예 1번 쿼리도 실행되지 않았던 과거로 되돌려주마(Rollback)"**라고 약속한다. 이것이 원자성이다.

📢 섹션 요약 비유: 원자성은 **'우주선 발사 버튼'**과 같습니다. 발사 버튼을 누르면 우주선이 쏘아 올려지거나, 아니면 발사대에서 멈춰 있어야 합니다. 우주선이 절반쯤 날아가다가 공중에 멈춰있는 '부분적인 성공'은 있을 수 없습니다.


Ⅱ. 원자성을 지켜주는 마법: Undo Log (언두 로그) ★

서버가 뻗었다가 다시 켜졌을 때, DB는 도대체 어떻게 과거로 시간을 되돌릴까? 답은 **'과거의 모습을 미리 몰래 적어두는 메모장(Undo Log)'**에 있다.

  1. 트랜잭션이 시작되고, UPDATE 쿼리가 들어온다.
  2. DB는 내 잔고를 깎기 전에, **"수정하기 전 원래 잔고는 5만 원이었음"**이라는 과거의 상태를 먼저 Undo Log에 몰래 쓴다.
  3. 그리고 내 진짜 잔고를 4만 원으로 고친다.
  4. 이때 서버가 펑! 터진다.
  5. (서버 재부팅 후) DB의 회복(Recovery) 시스템이 켜진다.
  6. 회복 시스템: "어? 아까 트랜잭션이 Commit 도장을 못 찍고 죽었네? 취소해야겠다. Undo Log 가져와!"
  7. Undo Log를 보고 내 잔고를 다시 5만 원으로 덮어씌운다(Rollback 완료).

Ⅲ. 원자성의 스펙트럼: All or Nothing

원자성은 중간이 없는 냉혹한 규칙이다.

  • ALL (성공): 1번 쿼리도 성공하고, 2번 쿼리도 성공했다. 비로소 DB는 COMMIT을 허락하고, Undo Log에 있던 "과거 5만 원" 기록을 쓰레기통에 버린다. 이제 과거로 돌아갈 수 없다.
  • NOTHING (실패): 1번만 성공하고 2번이 실패했거나, 사용자가 자발적으로 ROLLBACK을 외쳤다. DB는 즉시 Undo Log를 꺼내서 모든 데이터를 1번 쿼리가 시작되기 전(0%)으로 싹 다 원상 복구한다.
┌──────────────────────────────────────────────────────────────┐
│           원자성(Atomicity)을 보장하는 회복(Recovery) 과정 시각화         │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│ [ 👨‍💻 사용자 ] "이체 시작!" (트랜잭션 시작)                           │
│                                                              │
│ 1️⃣ 내 잔고 차감 전 ──▶ [ 📝 Undo Log ] 에 "원래 5만 원" 적어둠!        │
│ 2️⃣ 내 잔고 차감 실행 ──▶ (내 잔고 4만 원 됨)                        │
│                                                              │
│ 💥 앗! 친구 잔고 올려주기 전에 서버 터짐! (에러 발생)                   │
│                                                              │
│ 3️⃣ [ 🛠️ DB 회복 관리자 ] "트랜잭션이 덜 끝났잖아? 무효야!"              │
│ 4️⃣ [ 📝 Undo Log ] 확인 ──▶ "원래 5만 원이네?"                    │
│ 5️⃣ 내 잔고를 다시 5만 원으로 되돌림! (Rollback 🔄)                    │
│                                                              │
│ ★ 결론: 이체 작업은 결국 '아무 일도 일어나지 않은 상태(Nothing)'로 끝남.   │
└──────────────────────────────────────────────────────────────┘

Ⅳ. 결론

"실패할 수 있는 용기를 주는 가장 든든한 보험." 원자성은 백엔드 개발자가 비즈니스 로직을 짤 때 "중간에 에러가 나면 쓰레기 데이터가 남지 않을까?"라는 걱정을 머릿속에서 완전히 지워버리게 해주는 데이터베이스 최고의 발명품이다. Spring 프레임워크의 @Transactional 어노테이션 하나를 달아두는 것만으로도 수십 개의 쿼리가 한 몸처럼 움직일 수 있는 것은, 그 밑바닥에서 끊임없이 과거의 상태를 Undo Log에 기록하고 복구를 대기하는 RDBMS 엔진의 피나는 노력이 있기 때문이다.


📌 관련 개념 맵

  • 관련 특성: 일관성(C), 고립성(I), 영속성(D) (440번 문서)
  • 제어어: COMMIT, ROLLBACK (TCL - 418번 문서)
  • 보장 기법: Recovery Management (회복 관리), Undo Log (언두 로그)
  • 대칭 로그: Redo Log (리두 로그 - 영속성을 보장하기 위해 '미래의 변경 사항'을 적어두는 로그, 444번 문서)

👶 어린이를 위한 3줄 비유 설명

  1. 원자성은 레고로 '로봇 합체'를 하는 것과 같아요. 팔, 다리, 몸통이 다 합쳐져야 로봇이죠.
  2. 조립하다가 다리 하나를 잃어버려서 로봇 완성을 못 하게 생겼어요!
  3. 그러면 억지로 팔만 있는 이상한 로봇으로 놔두지 않고, 아예 조립했던 팔과 몸통을 다시 다 부수고 '처음의 레고 조각 상태'로 싹 되돌려놓는 규칙이랍니다!