🌳 16편. 트랜잭션과 격리 수준 완전 정리
트랜잭션은 데이터베이스의 일관성(Consistency)과 동시성(Concurrency)을 보장하는 핵심 개념입니다.
Oracle은 ANSI SQL의 4가지 격리 수준을 지원하며, 내부적으로 UNDO / REDO / SCN 등의 메커니즘으로 정합성을 유지합니다.
이번 글에서는 트랜잭션의 기본 개념부터 격리 수준별 특성과 실무에서의 선택 전략까지 정리합니다.
🔒 1. 트랜잭션이란?
하나의 논리적 작업 단위를 의미하며, 모든 작업이 전부 성공하거나 전부 실패해야 합니다.
✅ 기본 구조
BEGIN;
UPDATE ACCOUNT SET BALANCE = BALANCE - 100 WHERE ID = 1;
UPDATE ACCOUNT SET BALANCE = BALANCE + 100 WHERE ID = 2;
COMMIT;
- COMMIT: 트랜잭션 확정
- ROLLBACK: 트랜잭션 전체 취소
🧠 2. 격리 수준 (Isolation Level)
격리 수준은 트랜잭션 간의 간섭 정도를 조절하는 기준입니다. ANSI SQL은 4단계를 정의합니다.
격리 수준 | 허용 현상 | 설명 |
---|---|---|
READ UNCOMMITTED | Dirty Read | 다른 트랜잭션의 미확정 데이터를 읽음 |
READ COMMITTED (Oracle 기본) | Non-Repeatable Read | 다른 트랜잭션의 커밋된 최신 데이터만 읽음 |
REPEATABLE READ | Phantom Read | 동일 조건으로도 결과가 바뀌지 않지만 삽입은 허용 |
SERIALIZABLE | 없음 | 모든 트랜잭션을 순차적으로 처리하는 효과 |
⚙️ 3. Oracle의 기본 격리 수준
SELECT SYS_CONTEXT('USERENV','ISOLATION_LEVEL') FROM DUAL;
→ Oracle은 기본적으로 READ COMMITTED를 사용합니다.
- 다른 트랜잭션이 COMMIT하지 않은 데이터는 읽을 수 없음
- UNDO 영역을 이용한 Read Consistency 구현
🧪 4. SERIALIZABLE의 특징
- 트랜잭션 간 철저한 고립 → 모든 SELECT에도 잠금(Lock) 효과
- 다중 사용자가 동일 테이블을 SELECT만 해도 충돌 가능
- 실무에서는 거의 사용하지 않음 (로깅/배치 등 극히 제한적)
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
📌 5. 실무 격리 수준 선택 전략
상황 | 추천 격리 수준 | 이유 |
---|---|---|
대부분의 OLTP 시스템 | READ COMMITTED | 성능과 일관성 균형 |
복잡한 보고서 조회 | READ COMMITTED + SNAPSHOT | 조회 중 데이터 일관성 보장 |
정합성 100% 요구 (금융) | SERIALIZABLE | 동시성 낮지만 충돌 방지 |
🚧 6. 격리 수준 설정 방법
-- 트랜잭션 단위
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- 세션 전체
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;
📝 마무리
이번 글에서는 Oracle에서의 트랜잭션과 격리 수준에 대해 정리했습니다.
다음 글에서는 Lock의 종류와 Deadlock 방지 전략을 상세히 설명드리겠습니다.
'database > oracle' 카테고리의 다른 글
🌳 18편. Connection Pool과 세션 관리 (1) | 2025.05.07 |
---|---|
🌳 17편. Lock 이해와 Deadlock 방지 전략 (0) | 2025.05.07 |
🌳 15편. PARTITION 테이블과 대용량 테이블 설계 전략 (0) | 2025.05.06 |
🌳 14편. 실무 고급 SQL 패턴 모음 (0) | 2025.05.06 |
🌳 13편. 오라클 커서(Cursor)와 BULK COLLECT (1) | 2025.05.06 |
댓글