191. 트랜잭션 (Transaction) - 논리적 작업 단위

핵심 인사이트: 은행에서 A 통장에서 돈을 빼서 B 통장으로 입금하는 과정은 반드시 '한 세트'로 끝나야 한다. 돈을 뺐는데 입금하다 에러가 나면 뺀 돈마저 원래대로 돌려놔야 한다. 이렇게 쪼개질 수 없는 운명 공동체를 '트랜잭션(Transaction)'이라 부른다.

Ⅰ. 트랜잭션(Transaction)의 개념

데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 일련의 연산(SQL 쿼리들의 집합) 단위입니다. 작업이 100% 완벽하게 모두 처리되거나(Commit), 단 하나라도 에러가 발생하면 아예 처음부터 시작하지 않은 것처럼 100% 되돌려져야(Rollback) 하는 '불가분(All or Nothing)'의 성질을 가집니다.

Ⅱ. 트랜잭션의 상태 변화 (상태 전이도)

                          (모든 작업 완료)
                     ┌────▶ [ 부분 완료 ] ─────(Commit)──────┐
                     │     (Partially Commited)              ▼
 [ 활동 (Active) ] ──┤                                 [ 완료 (Commited) ]
  (실행 중인 상태)     │                                 (영구적 반영 완료)
                     ▼
                 [ 실패 (Failed) ] ────────(Rollback)────────┐
                (오류, 제약조건 위배)                        ▼
                                                     [ 철회 (Aborted) ]
                                                    (작업 취소, 원상 복구)
  1. 활동 (Active): 트랜잭션이 시작되어 SQL문들이 열심히 실행되고 있는 상태입니다.
  2. 부분 완료 (Partially Commited): 마지막 SQL문까지 실행을 끝냈으나, 아직 데이터베이스(디스크)에 결과를 '최종 확정(Commit)' 지어 쓰지는 않은 대기 상태입니다.
  3. 완료 (Commited): COMMIT 연산이 성공하여 데이터베이스 상태에 영구적으로 완벽히 반영된 상태입니다.
  4. 실패 (Failed): 하드웨어 고장, 교착 상태(Deadlock) 등으로 트랜잭션이 더 이상 진행될 수 없는 상태입니다.
  5. 철회 (Aborted): ROLLBACK 연산이 수행되어 트랜잭션이 한 일이 모두 취소되고 이전 상태로 복구된 상태입니다.

Ⅲ. 트랜잭션 제어어 (TCL, Transaction Control Language)

  • COMMIT: 트랜잭션의 작업 결과를 DB에 영구적으로 확정 짓습니다. 다른 사용자(세션)들도 이때부터 변경된 데이터를 볼 수 있습니다.
  • ROLLBACK: 트랜잭션 도중 문제가 생기면, 트랜잭션 시작 시점(또는 지정된 Savepoint)으로 모든 작업을 무효화하고 되돌립니다.
  • SAVEPOINT: 거대한 트랜잭션 도중에 세이브포인트(임시 저장점)를 여러 개 찍어두고, 전체가 아닌 "최근의 세이브포인트" 까지만 부분적으로 ROLLBACK 할 수 있게 해줍니다. (게임의 중간 세이브와 같음)

📢 섹션 요약 비유: 온라인 쇼핑몰에서 '결제 버튼'을 누르는 순간 트랜잭션이 시작됩니다. 내 통장에서 돈이 빠져나가고, 쇼핑몰에 입금되고, 재고가 차감되는 세 과정이 하나의 캡슐(트랜잭션)로 묶여 있습니다. 이 중 재고 차감에서 에러가 나면 캡슐 전체가 박살 나면서(Rollback), 빠져나갔던 내 돈도 완벽하게 다시 통장으로 돌아와야 안심할 수 있는 절대 규칙입니다.