트랜잭션

기술노트
Admin (토론 | 기여)님의 2025년 9월 11일 (목) 17:01 판 (Gemini 벌크 업로더로 자동 업로드)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

트랜잭션 (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`: 트랜잭션 내에 중간 저장 지점을 만들어, 특정 지점까지만 롤백할 수 있도록 합니다.