예시: A → B 100만원 이체

트랜잭션은 여러 SQL을 하나의 작업으로 묶고, 결과를 둘 중 하나로만 끝냅니다.

중간에 출금만 반영된 상태는 잠깐의 처리 과정일 뿐, 최종 상태로 남아서는 안 됩니다.

시작 상태

작업 전 데이터는 이미 일관된 상태입니다

이체 전 총합이 맞고, 아직 어떤 변경도 확정되지 않았습니다.

A 계좌 500만원 출금 전
B 계좌 200만원 입금 전
전체 합계 700만원 일관성 유지
트랜잭션 경계

이 두 문장은 따로 성공하는 것이 아니라 함께 묶여 처리됩니다

BEGIN; UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A'; UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';
1
출금과 입금은 한 논리적 작업입니다

둘 중 하나만 끝난 상태는 아직 완료된 결과가 아닙니다.

2
DB는 최종 결정을 기다립니다

COMMIT이면 모두 반영하고, 실패하면 ROLLBACK으로 전부 취소합니다.

종료 상태
COMMIT

두 변경이 함께 확정됩니다

이체가 성공했으므로 출금과 입금이 모두 반영된 상태가 최종 결과가 됩니다.

A: 400만원 B: 300만원 합계: 700만원
ROLLBACK

아무 일도 없었던 상태로 돌아갑니다

입금 단계에서 실패하면 출금도 취소되어, 부분 실행 흔적이 남지 않습니다.

A: 500만원 B: 200만원 합계: 700만원