418. TCL (Transaction Control Language) - 트랜잭션 제어어

⚠️ 이 문서는 데이터베이스에서 여러 개의 복잡한 작업(DML)들을 묶어서 **"전부 완벽하게 저장하든지(COMMIT), 아니면 중간에 하나라도 틀리면 아예 시작도 안 한 것처럼 전부 취소해 버리든지(ROLLBACK)"를 결정하는 트랜잭션 마법의 주문인 'TCL'**을 다룹니다.

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

  1. 본질: 데이터베이스의 생명인 트랜잭션(Transaction)의 논리적인 작업 단위를 확정 짓거나 취소하는 제어 명령어다.
  2. 명령어 종류: 영구 저장을 확정하는 COMMIT, 마지막 커밋 시점으로 돌아가는 ROLLBACK, 롤백의 중간 기착지를 만드는 SAVEPOINT 3가지가 전부다.
  3. 가치: 내 계좌에서 돈은 빠져나갔는데 친구 계좌에 돈이 안 들어가는 끔찍한 데이터 불일치 상황(ACID 중 원자성 위반)을 막아주는 최후의 안전장치다.

Ⅰ. 개요: 결재 서류와 파쇄기 (Context & Necessity)

은행에서 '계좌 이체'를 한다고 치자.

  1. 내 통장에서 1만 원을 뺀다. (UPDATE)
  2. 친구 통장에 1만 원을 더한다. (UPDATE)

만약 1번만 실행되고 서버가 뻗었다면? 나는 1만 원을 잃고 친구는 돈을 못 받는 대참사가 일어난다. 이 두 개의 UPDATE는 절대로 나뉘면 안 되는 **'하나의 묶음(트랜잭션)'**이다.

데이터베이스는 이 두 명령어를 받으면 디스크에 바로 쓰지 않고, 일단 메모리(임시 장부)에만 적어둔다. 그리고 관리자가 **"좋아, 두 개 다 완벽하게 끝났으니 확정해!(COMMIT)"**라고 외쳐야만 디스크에 영구적으로 도장을 찍는다. 만약 중간에 에러가 났다면 **"이거 다 취소하고 처음으로 돌아가!(ROLLBACK)"**라고 외쳐서 임시 장부를 파쇄기에 던져버린다.

📢 섹션 요약 비유: TCL은 **'결재 서류'**와 같습니다. 내가 기안서를 작성(DML)했다고 끝이 아니죠. 사장님이 결재 도장을 쾅 찍어줘야(COMMIT) 회사의 정식 문서가 되고, 사장님이 맘에 안 들어서 서류를 찢어버리면(ROLLBACK) 처음부터 다시 써야 하는 것과 같습니다.


Ⅱ. TCL의 핵심 명령어 3형제 ★

1. COMMIT (확정)

  • 기능: 그동안 임시로 작업했던 모든 변경 사항(INSERT, UPDATE, DELETE)을 디스크에 영구적으로 반영한다.
  • 특징: 커밋이 완료된 데이터는 정전이 나도 지워지지 않는다(Durability, 영속성 보장). 그리고 다른 사용자의 화면에서도 비로소 변경된 데이터가 보이기 시작한다.

2. ROLLBACK (취소)

  • 기능: 마지막으로 COMMIT을 쳤던 그 시점으로 타임머신을 타고 되돌아간다.
  • 특징: 커밋하지 않고 작업 중이던 모든 내용이 허공으로 날아간다(원상복구). 트랜잭션의 **원자성(Atomicity - All or Nothing)**을 보장하는 핵심 명령어다.

3. SAVEPOINT (저장점)

  • 기능: 롤백을 할 때 너무 과거(마지막 커밋)로 돌아가면 아까우니까, 중간중간 임시 부활 포인트를 만들어 두는 기능이다.
  • 문법: SAVEPOINT SP1; $\rightarrow$ 나중에 취소할 때 ROLLBACK TO SP1; 이라고 치면 딱 그 지점까지만 취소된다.

Ⅲ. 실무 주의점: 오토 커밋 (Auto Commit)

초보 개발자들이 가장 많이 헷갈리는 함정이다.

  • 데이터베이스 클라이언트(DBeaver, DataGrip 등)는 기본적으로 **'오토 커밋'**이 켜져 있다.
  • 내가 엔터를 칠 때마다 눈에 보이지 않게 뒤에서 COMMIT;이 자동으로 실행된다는 뜻이다.
  • 즉, DELETE 쿼리를 한 번 치는 순간 이미 확정되어 버렸으므로 ROLLBACK을 쳐도 데이터가 살아나지 않는다.
  • 실무 원칙: 실운영 DB에서 UPDATEDELETE를 할 때는, 반드시 쿼리창의 옵션에서 'Auto Commit'을 끄거나 명시적으로 START TRANSACTION; 명령어를 친 뒤에 작업해야 한다.
┌──────────────────────────────────────────────────────────────┐
│           TCL (COMMIT, ROLLBACK, SAVEPOINT) 흐름 시각화              │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  [ 시간 흐름 ]                                                  │
│                                                              │
│  10:00 ──▶ COMMIT; (초기 상태 확정)                             │
│                                                              │
│  10:01 ──▶ INSERT A;                                          │
│  10:02 ──▶ SAVEPOINT SP1; ◀── (중간 저장점 생성 💾)             │
│                                                              │
│  10:03 ──▶ INSERT B;                                          │
│  10:04 ──▶ UPDATE C;                                          │
│                                                              │
│  10:05 ──▶ 앗! C 수정 잘못함! "ROLLBACK TO SP1;" 실행! 🔄        │
│                                                              │
│ ★ 결과: B와 C의 작업은 취소되어 날아갔지만, A의 작업은 살아있음!               │
└──────────────────────────────────────────────────────────────┘

Ⅳ. 결론

"데이터를 다루는 자의 마침표이자 지우개." SQL의 세계에서 DDL(건축)과 DML(인테리어)이 눈에 보이는 변화를 만들어낸다면, TCL은 그 변화를 현실 세계의 장부에 '언제 어떻게 적어 넣을 것인가'를 통제하는 보이지 않는 탯줄이다. 특히 수많은 고객이 동시에 데이터를 수정하는 현대 웹 서비스에서, 프레임워크(Spring의 @Transactional 등)가 백그라운드에서 끊임없이 쏘아대는 COMMITROLLBACK의 메커니즘을 뼛속까지 이해하지 못하면 결코 신뢰할 수 있는 백엔드 시스템을 설계할 수 없다.


📌 관련 개념 맵

  • 관련 명령어: DML (INSERT, UPDATE, DELETE - 416번 문서)
  • 제약 조건: 트랜잭션의 4가지 성질 (ACID - Atomicity, Consistency, Isolation, Durability)
  • 프레임워크 연동: Spring @Transactional (자동 롤백 처리)
  • 시험 팁: 정보처리기사에서는 TCL을 DCL의 하위 개념으로 묶어서 출제하기도 한다.

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

  1. 여러분이 컴퓨터로 긴 글을 쓸 때, 중간중간 누르는 '저장하기(Ctrl+S)' 버튼이 바로 COMMIT이에요!
  2. 글을 막 쓰다가 맘에 안 들어서 방금 쓴 걸 싹 지우는 '되돌리기(Ctrl+Z)' 버튼이 바로 ROLLBACK이죠.
  3. 데이터베이스는 너무 깐깐해서, 내가 COMMIT 버튼을 확실하게 눌러주지 않으면 컴퓨터를 껐다 켰을 때 내가 쓴 글을 싹 다 날려버린답니다!