418. TCL (Transaction Control Language) - 트랜잭션 제어어
⚠️ 이 문서는 데이터베이스에서 여러 개의 복잡한 작업(DML)들을 묶어서 **"전부 완벽하게 저장하든지(COMMIT), 아니면 중간에 하나라도 틀리면 아예 시작도 안 한 것처럼 전부 취소해 버리든지(ROLLBACK)"를 결정하는 트랜잭션 마법의 주문인 'TCL'**을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 데이터베이스의 생명인 트랜잭션(Transaction)의 논리적인 작업 단위를 확정 짓거나 취소하는 제어 명령어다.
- 명령어 종류: 영구 저장을 확정하는
COMMIT, 마지막 커밋 시점으로 돌아가는ROLLBACK, 롤백의 중간 기착지를 만드는SAVEPOINT3가지가 전부다.- 가치: 내 계좌에서 돈은 빠져나갔는데 친구 계좌에 돈이 안 들어가는 끔찍한 데이터 불일치 상황(ACID 중 원자성 위반)을 막아주는 최후의 안전장치다.
Ⅰ. 개요: 결재 서류와 파쇄기 (Context & Necessity)
은행에서 '계좌 이체'를 한다고 치자.
- 내 통장에서 1만 원을 뺀다. (
UPDATE) - 친구 통장에 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에서
UPDATE나DELETE를 할 때는, 반드시 쿼리창의 옵션에서 '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 등)가 백그라운드에서 끊임없이 쏘아대는 COMMIT과 ROLLBACK의 메커니즘을 뼛속까지 이해하지 못하면 결코 신뢰할 수 있는 백엔드 시스템을 설계할 수 없다.
📌 관련 개념 맵
- 관련 명령어: DML (INSERT, UPDATE, DELETE - 416번 문서)
- 제약 조건: 트랜잭션의 4가지 성질 (ACID - Atomicity, Consistency, Isolation, Durability)
- 프레임워크 연동: Spring
@Transactional(자동 롤백 처리) - 시험 팁: 정보처리기사에서는 TCL을 DCL의 하위 개념으로 묶어서 출제하기도 한다.
👶 어린이를 위한 3줄 비유 설명
- 여러분이 컴퓨터로 긴 글을 쓸 때, 중간중간 누르는 '저장하기(Ctrl+S)' 버튼이 바로 COMMIT이에요!
- 글을 막 쓰다가 맘에 안 들어서 방금 쓴 걸 싹 지우는 '되돌리기(Ctrl+Z)' 버튼이 바로 ROLLBACK이죠.
- 데이터베이스는 너무 깐깐해서, 내가 COMMIT 버튼을 확실하게 눌러주지 않으면 컴퓨터를 껐다 켰을 때 내가 쓴 글을 싹 다 날려버린답니다!