191. 트랜잭션 (Transaction) - 논리적 작업 단위
핵심 인사이트: 은행에서 A 통장에서 돈을 빼서 B 통장으로 입금하는 과정은 반드시 '한 세트'로 끝나야 한다. 돈을 뺐는데 입금하다 에러가 나면 뺀 돈마저 원래대로 돌려놔야 한다. 이렇게 쪼개질 수 없는 운명 공동체를 '트랜잭션(Transaction)'이라 부른다.
Ⅰ. 트랜잭션(Transaction)의 개념
데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 일련의 연산(SQL 쿼리들의 집합) 단위입니다. 작업이 100% 완벽하게 모두 처리되거나(Commit), 단 하나라도 에러가 발생하면 아예 처음부터 시작하지 않은 것처럼 100% 되돌려져야(Rollback) 하는 '불가분(All or Nothing)'의 성질을 가집니다.
Ⅱ. 트랜잭션의 상태 변화 (상태 전이도)
(모든 작업 완료)
┌────▶ [ 부분 완료 ] ─────(Commit)──────┐
│ (Partially Commited) ▼
[ 활동 (Active) ] ──┤ [ 완료 (Commited) ]
(실행 중인 상태) │ (영구적 반영 완료)
▼
[ 실패 (Failed) ] ────────(Rollback)────────┐
(오류, 제약조건 위배) ▼
[ 철회 (Aborted) ]
(작업 취소, 원상 복구)
- 활동 (Active): 트랜잭션이 시작되어 SQL문들이 열심히 실행되고 있는 상태입니다.
- 부분 완료 (Partially Commited): 마지막 SQL문까지 실행을 끝냈으나, 아직 데이터베이스(디스크)에 결과를 '최종 확정(Commit)' 지어 쓰지는 않은 대기 상태입니다.
- 완료 (Commited):
COMMIT연산이 성공하여 데이터베이스 상태에 영구적으로 완벽히 반영된 상태입니다. - 실패 (Failed): 하드웨어 고장, 교착 상태(Deadlock) 등으로 트랜잭션이 더 이상 진행될 수 없는 상태입니다.
- 철회 (Aborted):
ROLLBACK연산이 수행되어 트랜잭션이 한 일이 모두 취소되고 이전 상태로 복구된 상태입니다.
Ⅲ. 트랜잭션 제어어 (TCL, Transaction Control Language)
- COMMIT: 트랜잭션의 작업 결과를 DB에 영구적으로 확정 짓습니다. 다른 사용자(세션)들도 이때부터 변경된 데이터를 볼 수 있습니다.
- ROLLBACK: 트랜잭션 도중 문제가 생기면, 트랜잭션 시작 시점(또는 지정된 Savepoint)으로 모든 작업을 무효화하고 되돌립니다.
- SAVEPOINT: 거대한 트랜잭션 도중에 세이브포인트(임시 저장점)를 여러 개 찍어두고, 전체가 아닌 "최근의 세이브포인트" 까지만 부분적으로
ROLLBACK할 수 있게 해줍니다. (게임의 중간 세이브와 같음)
📢 섹션 요약 비유: 온라인 쇼핑몰에서 '결제 버튼'을 누르는 순간 트랜잭션이 시작됩니다. 내 통장에서 돈이 빠져나가고, 쇼핑몰에 입금되고, 재고가 차감되는 세 과정이 하나의 캡슐(트랜잭션)로 묶여 있습니다. 이 중 재고 차감에서 에러가 나면 캡슐 전체가 박살 나면서(Rollback), 빠져나갔던 내 돈도 완벽하게 다시 통장으로 돌아와야 안심할 수 있는 절대 규칙입니다.