트랜잭션
기술노트
트랜잭션 (Transaction)
트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 논리적인 작업의 단위입니다.
하나의 트랜잭션은 한 개 이상의 SQL 쿼리(INSERT, DELETE, UPDATE 등)를 포함할 수 있습니다. 예를 들어, '계좌 이체'라는 하나의 논리적 작업을 위해 'A 계좌 잔액 차감'과 'B 계좌 잔액 증가'라는 두 개의 쿼리가 실행되어야 합니다. 데이터베이스는 이 두 쿼리를 하나의 트랜잭션, 즉 쪼갤 수 없는 작업 단위로 묶어 데이터의 무결성과 일관성을 보장합니다.
트랜잭션이 필요한 이유
만약 트랜잭션이라는 개념이 없다면, 'A 계좌 잔액 차감'에는 성공했지만, 그 직후 시스템 장애로 'B 계좌 잔액 증가'에는 실패하는 상황이 발생할 수 있습니다. 이 경우 A의 돈은 사라졌지만 B에게는 전달되지 않아 데이터의 정합성이 깨지는 심각한 문제가 발생합니다. 트랜잭션은 이와 같은 문제를 방지하고 데이터베이스를 항상 신뢰할 수 있는 상태로 유지하기 위해 반드시 필요합니다.
트랜잭션의 핵심 속성: ACID
신뢰할 수 있는 트랜잭션은 반드시 4가지 핵심 속성을 만족해야 하며, 이를 **ACID**라고 부릅니다.
- **원자성 (Atomicity):** 트랜잭션의 모든 작업이 전부 성공하거나, 전부 실패해야 합니다.
- **일관성 (Consistency):** 트랜잭션 실행 후에도 데이터베이스는 항상 일관된 상태를 유지해야 합니다.
- **고립성 (Isolation):** 하나의 트랜잭션은 다른 트랜잭션의 영향을 받지 않고 독립적으로 실행되어야 합니다.
- **지속성 (Durability):** 성공한 트랜잭션의 결과는 영구적으로 저장되어야 합니다.
각 속성에 대한 자세한 설명은 아래 링크를 참고하세요.
트랜잭션의 상태 변화
트랜잭션은 실행 과정에서 다음과 같은 5가지 상태를 거칩니다.
- 1. 활동 (Active)
- 트랜잭션이 실행을 시작하여 현재 실행 중인 상태입니다. 연산들이 정상적으로 실행되고 있는 동안 이 상태를 유지합니다.
- 2. 부분 완료 (Partially Committed)
- 트랜잭션의 마지막 연산까지 모두 실행했지만, 아직 데이터베이스에 최종적으로 변경 내용을 반영하지는(COMMIT) 않은 상태입니다. 모든 연산이 성공했음을 확인하고 최종 커밋을 준비하는 단계입니다.
- 3. 완료 (Committed)
- 트랜잭션의 모든 연산이 성공적으로 완료되어, 변경 내용이 데이터베이스에 영구적으로 저장된 상태입니다. COMMIT 연산을 통해 이 상태가 됩니다.
- 4. 실패 (Failed)
- 하드웨어 고장, 데이터 무결성 제약조건 위반 등 여러 이유로 트랜잭션의 실행이 중단된 상태입니다.
- 5. 철회 (Aborted)
- 트랜잭션이 실패하여 실행 이전의 상태로 모든 작업을 되돌린(ROLLBACK) 상태입니다. 트랜잭션이 비정상적으로 종료되었음을 의미합니다.
트랜잭션 제어 언어 (TCL)
사용자는 SQL의 트랜잭션 제어 언어(TCL)를 통해 트랜잭션을 직접 제어할 수 있습니다.
- `COMMIT`: 모든 작업을 최종적으로 데이터베이스에 반영합니다.
- `ROLLBACK`: 진행된 모든 작업을 취소하고 트랜잭션 이전 상태로 되돌립니다.
- `SAVEPOINT`: 트랜잭션 내에 중간 저장 지점을 만들어, 특정 지점까지만 롤백할 수 있도록 합니다.