트랜잭션의 개념과 정의
트랜잭션(Transaction)이란 데이터베이스에서 하나의 논리적 작업 단위를 의미합니다. 즉, 여러 개의 연산(SELECT, INSERT, UPDATE, DELETE 등)을 하나로 묶어서 모두 성공하거나 모두 실패하도록 처리하는 것을 말합니다.
트랜잭션의 핵심 목적은 데이터의 일관성과 무결성을 보장하는 것입니다. 데이터베이스 시스템에서는 여러 사용자가 동시에 데이터를 조작할 수 있으므로 중간에 실패하거나 오류가 발생했을 때 이를 복구하여 데이터의 상태를 안정적으로 유지해야 합니다.
트랜잭션은 일반적으로 다음과 같은 명령어 흐름을 따릅니다:
- 트랜잭션 시작 (BEGIN 또는 START TRANSACTION)
- 여러 SQL 연산 수행
- 성공 시 COMMIT
- 실패 또는 오류 발생 시 ROLLBACK
커밋(COMMIT)의 의미와 역할
COMMIT은 트랜잭션 내에서 수행된 모든 변경사항을 영구적으로 반영하는 명령어입니다. COMMIT이 수행되면 해당 트랜잭션은 종료되며, 이후에는 해당 트랜잭션에 대한 ROLLBACK이 불가능합니다.
- 데이터베이스는 COMMIT 시점에 디스크에 데이터를 기록하여 영속성을 보장합니다.
- COMMIT 이후 다른 사용자나 트랜잭션에서도 해당 변경된 데이터를 확인할 수 있습니다.
예:
BEGIN;
UPDATE users SET balance = balance - 100 WHERE id = 1;
UPDATE users SET balance = balance + 100 WHERE id = 2;
COMMIT;
위 트랜잭션은 두 사용자의 잔고를 동시에 변경하고, COMMIT을 통해 실제 반영합니다.
롤백(ROLLBACK)의 의미와 역할
ROLLBACK은 트랜잭션 내에서 발생한 모든 변경사항을 원래 상태로 되돌리는 명령어입니다. 트랜잭션 도중 오류가 발생하거나 사용자가 명시적으로 중단을 요청할 경우 수행됩니다.
- ROLLBACK은 트랜잭션의 원자성을 보장합니다.
- ROLLBACK 이전의 상태로 모든 변경사항을 취소함으로써 데이터의 일관성을 유지합니다.
예:
BEGIN;
UPDATE products SET quantity = quantity - 1 WHERE id = 10;
-- 오류 발생: 제품 재고 부족
ROLLBACK;
트랜잭션 전파(Transaction Propagation)의 개념과 유형
트랜잭션 전파(Transaction Propagation)는 하나의 트랜잭션이 다른 트랜잭션을 호출하거나 포함할 때, 트랜잭션이 어떻게 동작해야 하는지를 정의하는 개념입니다. 이는 특히 Spring Framework나 JPA 같은 트랜잭션을 추상화하는 환경에서 중요합니다.
주요 전파 속성은 다음과 같습니다:
- REQUIRED
- 현재 트랜잭션이 존재하면 이를 그대로 사용, 없으면 새로운 트랜잭션 생성
- REQUIRES_NEW
- 항상 새로운 트랜잭션을 생성하며 기존 트랜잭션은 일시 중지됨
- SUPPORTS
- 트랜잭션이 있으면 참여하고, 없으면 트랜잭션 없이 실행
- NOT_SUPPORTED
- 항상 트랜잭션 없이 실행하며, 기존 트랜잭션이 있으면 일시 중단
- MANDATORY
- 반드시 트랜잭션 내에서 호출되어야 하며, 없으면 예외 발생
- NEVER
- 트랜잭션이 존재하면 예외 발생, 항상 비트랜잭션 방식
- NESTED
- 내부 트랜잭션을 별도로 정의하여 부분적으로 ROLLBACK 가능
ACID의 개념과 각 구성 요소에 대한 상세 설명
트랜잭션이 가져야 할 4가지 기본 속성을 ACID라고 합니다. 이는 데이터베이스의 안정성과 신뢰성을 보장하는 핵심 개념입니다.
Atomicity (원자성)
- 트랜잭션 내의 작업은 모두 성공하거나 모두 실패해야 합니다.
- 부분 성공은 허용되지 않으며, ROLLBACK을 통해 전체 연산을 취소할 수 있어야 합니다.
Consistency (일관성)
- 트랜잭션이 성공적으로 완료되면 데이터는 항상 일관된 상태여야 합니다.
- 데이터베이스의 제약조건(무결성, 외래키 등)을 항상 만족해야 합니다.
Isolation (격리성)
- 동시에 여러 트랜잭션이 수행되더라도, 각각의 트랜잭션은 고립된 상태에서 실행되어야 합니다.
- 중간 상태의 데이터를 다른 트랜잭션에서 볼 수 없어야 하며, 충돌이 없어야 합니다.
Durability (지속성)
- 트랜잭션이 COMMIT된 이후에는 시스템 오류가 발생하더라도 그 변경사항은 보존되어야 합니다.
- 일반적으로 WAL(Write Ahead Logging) 등의 기법을 통해 디스크에 데이터를 기록함으로써 보장됩니다.
트랜잭션의 격리성 수준(Isolation Level)의 개념과 종류
트랜잭션 격리성 수준은 동시에 실행되는 트랜잭션 간의 상호작용을 어떻게 제한할지를 정의하는 설정입니다. 이는 데이터의 정확성을 높이기 위해 필수적인 요소입니다.
다음은 대표적인 4가지 격리 수준입니다 (낮은 수준에서 높은 수준 순):
- READ UNCOMMITTED
- 다른 트랜잭션에서 COMMIT되지 않은 데이터를 읽을 수 있음 (Dirty Read 발생)
- READ COMMITTED
- 오직 COMMIT된 데이터만 읽을 수 있음 (Non-Repeatable Read 발생 가능)
- REPEATABLE READ
- 같은 트랜잭션 내에서는 동일한 데이터를 반복 조회해도 항상 같은 값 반환
(Phantom Read 발생 가능)
- 같은 트랜잭션 내에서는 동일한 데이터를 반복 조회해도 항상 같은 값 반환
- SERIALIZABLE
- 가장 높은 수준의 격리, 트랜잭션을 직렬화하여 실행 (모든 이상현상 방지)
트랜잭션 이상현상과의 관계
- Dirty Read: 아직 COMMIT되지 않은 데이터를 읽음
- Non-Repeatable Read: 같은 쿼리를 두 번 실행했을 때 다른 결과가 반환됨
- Phantom Read: 같은 조건으로 데이터를 조회했을 때, 두 번째 조회 시 새로운 행이 추가됨
데이터베이스 트랜잭션 격리수준과 이상현상
트랜잭션 격리 수준(Isolation Level)의 개념과 필요성트랜잭션 격리 수준(Isolation Level)이란 동시에 실행되는 여러 트랜잭션이 데이터베이스에 접근할 때, 각 트랜잭션이 다른 트랜잭션의 작업에 어
mint10.tistory.com
요약
- 트랜잭션은 데이터베이스 작업의 논리적 단위로, 실패 시 전체를 되돌리는 특징이 있습니다.
- COMMIT은 작업을 확정짓고, ROLLBACK은 작업을 취소합니다.
- 트랜잭션 전파는 다른 트랜잭션 호출 시의 동작 방식을 규정합니다.
- ACID 속성은 트랜잭션의 안정성과 무결성을 보장합니다.
- 격리성 수준은 동시성 제어의 핵심 요소이며, 데이터 정확성을 위해 중요합니다.
'백엔드 공부일지 > 데이터베이스 공부일지' 카테고리의 다른 글
클러스터드 인덱스와 넌클러스터드 인덱스 차이 (0) | 2025.05.12 |
---|---|
데이터베이스 트랜잭션 격리수준과 이상현상 (0) | 2025.05.11 |
SQL 조인 알고리즘 비교: Hash join (해시 조인) (0) | 2025.05.11 |
SQL 조인 알고리즘 비교: Sort-Merge Join (정렬 병합 조인) (0) | 2025.05.10 |
SQL 조인 알고리즘 비교: Nested Loop Join (중첩 루프 조인) (0) | 2025.05.08 |