DB에서 트랜잭션 관리는 필수적인 요소이다. 데이터의 무결성을 유지하고, 동시 접근을 효율적으로 제어하며, 장애 발생 시 복구할 수 있도록 설계해야 한다. 이를 위해 트랜잭션 관리 방안을 수립하는 것이 중요하다. 이번 포스팅에서는 트랜잭션 개념과 트랜잭션 관리 방안, 그리고 트랜잭션의 상태 변화와 격리 수준까지 알아보자~!
ㅁ트랜잭션(transaction): 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위
(트랜잭션 관리의 중요성)
하나의 트랜잭션은 여러 개의 작업(쿼리)으로 구성될 수 있으며, 모든 작업이 성공적으로 완료되어야만 데이터베이스에 반영된다. 트랜잭션 관리를 통해 다음과 같은 기능을 제공할 수 있다.
- 데이터 무결성 유지
- 동시 접근 제어(락을 사용)
- 장애 발생 시 복구 기능 제공
ACID 속성
트랜잭션이 올바르게 수행되기 위해서는 ACID 속성을 준수해야 한다. ACID는 다음 네 가지 속성으로 구성된다.
- 원자성(Atomicity): 트랜잭션의 모든 연산이 완전히 수행되거나 전혀 수행되지 않아야 한다
- 일관성(Consistency): 트랜잭션이 실행된 후에도 데이터베이스가 일관된 상태를 유지해야 한다
- 격리성(Isolation): 동시에 실행되는 트랜잭션이 서로 영향을 주지 않아야 한다
- 지속성(Durability): 트랜잭션이 완료된 후에도 결과가 영구적으로 저장되어야 한다
트랜잭션 제어 기능들
트랜잭션을 효과적으로 관리하기 위해 다양한 트랜잭션 제어 기능을 제공한다. 대표적인 트랜잭션 제어 기능은 다음과 같다.
1. 트랜잭션 시작과 종료
- BEGIN TRANSACTION: 트랜잭션의 시작을 명시적으로 선언한다.
- 커밋(COMMIT): 모든 작업을 정상적으로 수행한 후 변경 사항을 데이터베이스에 영구적으로 반영한다
- 롤백(ROLLBACK): 오류 발생 시 변경 사항을 취소하고 트랜잭션을 초기 상태로 되돌린다
※ 트랜잭션의 상태 변화
트랜잭션은 수행 중 특정 상태를 거치며 최종적으로 커밋되거나 롤백된다. 각각의 상태에서 데이터의 접근성과 잠금 상태가 다르게 동작한다.
① 커밋(Commit) 혹은 롤백(Rollback) 하기 전 상태
- 모든 데이터의 변경 사항은 데이터베이스 버퍼(Database Buffer)에 저장된다.
- 현재 트랜잭션을 수행하는 사용자는 자신이 변경한 데이터를 SELECT 문을 통해 볼 수 있지만 "다른 사용자는 그 변경된 내용을 확인할 수 없다"
- 트랜잭션이 변경한 데이터(Row)는 잠금(Lock) 상태에 놓이며, 다른 사용자가 해당 데이터를 수정할 수 없다.
- 이러한 방식은 Row Level Locking Mechanism을 기반으로 한다.
② 커밋(Commit)한 후의 상태
- 트랜잭션 내에서 변경된 데이터가 데이터베이스에 영구적으로 반영된다.
- "다른 모든 사용자가 해당 데이터를 조회할 수 있다"
- 해당 데이터(Row)에 설정된 잠금(Lock)이 해제된다.
2. 동시성 제어
- 낙관적 동시성 제어(Optimistic Concurrency Control): 트랜잭션 간 충돌이 드물다고 가정하고, 변경 사항을 최종적으로 검증하여 충돌이 발생하면 롤백하는 방식이다.
- 비관적 동시성 제어(Pessimistic Concurrency Control): 트랜잭션이 실행되는 동안 락을 걸어 충돌을 사전에 방지하는 방식이다.
3. 트랜잭션의 격리 수준 4단계
- Dirty Read (더티 리드): 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 경우
데이터 일관성이 깨질 수 있다!
예시
- A 트랜잭션이 잔액을 100만 원 → 50만 원으로 변경 (아직 커밋되지 않음)
- B 트랜잭션이 A의 변경된 데이터(잔액 50만 원)를 읽음
- 이후 A 트랜잭션이 롤백되면, B는 잘못된 데이터를 본 셈이 됨
- Non-Repeatable Read (반복 불가능한 읽기): 하나의 트랜잭션 내에서 동일한 데이터를 두 번 읽었는데 값이 다르게 나오는 경우
일관성 문제 발생
예시
- A 트랜잭션이 잔액 100만 원 조회
- B 트랜잭션이 잔액을 200만 원으로 수정 후 커밋
- A 트랜잭션이 같은 데이터를 다시 조회하면 200만 원으로 변경됨 → 값이 달라짐
- Phantom Read (팬텀 리드): 트랜잭션 중간에 다른 트랜잭션이 데이터를 추가 또는 삭제하여 조회 결과의 개수가 바뀌는 현상
예시
- A 트랜잭션이 고객 수를 조회한 결과 10명
- B 트랜잭션이 새로운 고객을 추가하고 커밋
- A 트랜잭션이 동일한 조건으로 다시 조회했을 때 고객 수가 11명으로 증가 → 처음 조회와 다름
트랜잭션 관리는 데이터베이스 시스템의 신뢰성과 성능을 보장하는 중요한 요소이다. ACID 속성을 준수하면서 적절한 트랜잭션 제어 기능을 활용하면 안정적인 데이터베이스 운영이 가능하다! 중요 또 중요
'DBMS > 데이터베이스' 카테고리의 다른 글
[데이터베이스] SQL 연습문제 (0) | 2025.02.06 |
---|---|
[데이터베이스] SQL JOIN + INDEX 개념 (0) | 2025.02.06 |
[데이터베이스] 대표적인 데이터 모델링 기법 4가지 (0) | 2025.02.06 |
[데이터베이스] 표준화 명세서와 정규화 과정 (0) | 2025.02.05 |
[데이터베이스] 빅데이터(Big Data) (2) | 2024.07.03 |