본문 바로가기
데이터베이스

트랜잭션(Transaction) 에 대해 알아보겠습니다.

by forward error correction Circle 2025. 7. 21.
반응형

Ⅰ. 데이터베이스에서 사용되는 트랜잭션(Transaction) 이란?

 트랜잭션(Transaction)은 데이터베이스에서 데이터의 일관성과 신뢰성을 보장하기 위해 하나의 논리적 작업 단위로 처리되는 연산 집합을 말합니다. 예를 들어, 은행 계좌 이체, 쇼핑몰 주문 처리 등 복잡한 데이터 변경 작업에서 일부만 처리되면 데이터가 불완전하거나 오류가 발생할 수 있으므로, 이러한 작업을 트랜잭션으로 묶어 모두 성공하거나 모두 실패하도록 처리해야 합니다.


Ⅱ. 트랜잭션(Transaction) 특징 (ACID)

트랜잭션이 제대로 작동하기 위해서는 다음 네 가지 특성을 반드시 만족해야 합니다. 이를 ACID 특성이라 합니다.

ⅰ. 원자성 (Atomicity)
  ■ 트랜잭션 내 모든 연산은 전부 성공하거나 전부 실패해야 합니다.
  ■ 하나라도 실패하면 전체 트랜잭션은 롤백(Rollback) 되어 원래 상태로 되돌아갑니다.
  ■ 예: 계좌 이체 중 B 계좌 입금이 실패하면 A 계좌의 출금도 취소되어야 함.
ⅱ. 일관성 (Consistency)
  ■ 트랜잭션 실행 전과 실행 후의 데이터는 항상 일관성 있는 상태를 유지해야 합니다.
  ■ 모든 무결성 제약 조건(예: 외래키, 범위 제한 등)을 위반하지 않아야 합니다.
  ■ 예: 이체 전후에도 전체 계좌의 총 금액은 동일해야 함.
ⅲ. 고립성 (Isolation)
  ■ 여러 트랜잭션이 동시에 실행될 때, 서로 간섭하지 않도록 격리되어야 합니다.
  ■ 하나의 트랜잭션이 완료되기 전까지는 그 연산 결과가 다른 트랜잭션에 보이지 않아야 합니다.
  ■ 예: 다른 사용자가 주문 처리 중인 데이터를 중간에 조회해도 결과가 변하지 않아야 함.
ⅳ. 지속성 (Durability)
  ■ 트랜잭션이 정상적으로 완료되면(COMMIT) 그 결과는 시스템 장애가 발생해도 영구히 저장되어야 합니다.
  ■ 예: 전원이 꺼져도 이미 완료된 이체 결과는 사라지지 않음.

 

Ⅲ. 트랜잭션(Transaction) 처리 과정

ⅰ. 트랜잭션 시작
  ■  BEGIN 또는 START TRANSACTION 명령으로 시작
ⅱ. 작업 수행
  ■  INSERT, UPDATE, DELETE 등 데이터 조작
ⅲ. 정상 종료 시
  ■  COMMIT 명령으로 변경 내용을 데이터베이스에 확정
 ⅳ. 오류 발생 시
  ■  ROLLBACK 명령으로 전체 작업 취소 및 이전 상태로 복구

Ⅳ. 트랜잭션(Transaction) 상태 변화

ⅰ. Active: 실행 중
ⅱ. Partially Committed: 마지막 연산까지 실행됨
ⅲ. Committed: 모든 작업이 성공적으로 완료되어 DB에 반영됨
ⅳ. Failed: 실행 중 오류 발생
ⅴ. Aborted: 실패로 인해 롤백됨

Ⅴ. 트랜잭션 제어어 (TCL: Transaction Control Language)

 ⅰ. BEGIN 또는 START TRANSACTION: 트랜잭션 시작
 ⅱ. COMMIT: 트랜잭션의 모든 작업을 영구 반영
 ⅲ. ROLLBACK: 트랜잭션의 모든 작업을 취소
 ⅳ. SAVEPOINT: 롤백 가능한 중간 지점 설정
 ⅴ. SET TRANSACTION: 트랜잭션의 속성 설정 (예: 격리 수준)

Ⅵ. 트랜잭션(Transaction) 대표적인 예시

ⅰ. 은행 계좌 이체
  ■  A 계좌 출금 → B 계좌 입금
  ■ 두 작업이 모두 성공해야만 이체 완료. 하나라도 실패하면 전체 취소
ⅱ. 쇼핑몰 주문 처리
  ■ 재고 감소 → 결제 처리 → 주문 내역 저장
  ■ 모든 단계가 성공해야만 최종 주문이 유효

Ⅶ. 트랜잭션(Transaction) 격리 수준(Isolation Level)

트랜잭션이 동시에 실행될 때 발생할 수 있는 데이터 충돌을 방지하기 위해, 데이터 간의 공유 허용 범위를 다음과 같은 격리 수준(Isolation Level)으로 설정할 수 있습니다.

격리 수준 Dirty Read Non-repeatable Read Phantom Read 설명
Read Uncommitted
허용 허용 허용 가장 낮은 수준. 아직 커밋되지 않은
트랜잭션의 변경 내용도 읽을 수 있음
Read Committed 불가 허용 허용 오직 커밋된 데이터만 읽을 수 있음. 
기본 설정인 경우가 많음
Repeatable Read 불가 불가 허용 한 트랜잭션 동안 같은 데이터를 여러 번 읽어도 값이 동일
Serializable 불가 불가 불가 가장 높은 수준. 모든 트랜잭션을 순차적으로 실행한 것처럼 보장


ⅰ. Dirty Read: 다른 트랜잭션에서 커밋되지 않은 데이터를 읽음
ⅱ. Non-repeatable Read: 같은 조건의 조회를 반복했을 때 결과가 달라짐
ⅲ. Phantom Read: 반복 쿼리에서 새로운 데이터가 추가되거나 기존 데이터가 사라짐

반응형