데이터베이스

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

forward error correction Circle 2025. 7. 21. 08:37
반응형

Ⅰ. 데이터베이스에서 사용되는 트랜잭션(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: 반복 쿼리에서 새로운 데이터가 추가되거나 기존 데이터가 사라짐

반응형