본문 바로가기
database/oracle

🌳 16편. 트랜잭션과 격리 수준 완전 정리

by 죄니안죄니 2025. 5. 7.

🌳 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 방지 전략을 상세히 설명드리겠습니다.

댓글