Ⅰ. 데이터베이스에서 사용되는 트랜잭션(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: 반복 쿼리에서 새로운 데이터가 추가되거나 기존 데이터가 사라짐
'데이터베이스' 카테고리의 다른 글
| 데이터베이스 샤딩(Database Sharding)에 대해 알아보겠습니다. (0) | 2025.10.16 |
|---|---|
| Redis(Remote Dictionary Server) 에 대해 알아보겠습니다. (3) | 2025.08.12 |
| OLTP (Online Transaction Processing) 와 OLAP(Online Analytical Processing) 에 대해 알아보겠습니다. (1) | 2025.07.16 |
| 정적 SQL과 동적 SQL 에 대해 알아보겠습니다. (0) | 2025.07.01 |
| 데이터베이스에 사용되는 인덱스(Index)에 대해 알아보겠습니다. (1) | 2025.06.27 |