트랜잭션 격리 수준 4단계 정리, Dirty·Non-Repeatable·Phantom Read가 생기는 이유와 락·MVCC 차이 (SQLD)

같은 계좌를 두 사용자가 동시에 건드릴 때 데이터베이스가 어디까지 서로의 작업을 보여 줄지 정하는 설정이 트랜잭션 격리 수준이다. SQLD의 트랜잭션·락 단원과 정보관리기술사 데이터베이스 영역에서 이상 현상 세 가지와 수준별 허용 여부를 묻는 형태로 자주 나온다. 표 하나만 외워도 되지만, 왜 그 칸이 비어 있는지 알아야 서술형에서 막히지 않는다.

격리 수준은 동시 실행 트랜잭션이 서로의 중간 상태를 얼마나 볼 수 있는지 정하는 값이다

격리성(Isolation)은 ACID의 I에 해당한다. 가장 엄격한 기준은 직렬 가능성(Serializability)으로, 동시에 실행해도 결과가 어떤 순차 실행과 같아야 한다는 뜻이다. 다만 이를 완벽히 지키면 대기와 롤백이 늘어 처리량이 떨어진다. 그래서 표준은 일관성을 일부 양보하는 대신 동시성을 높이는 단계를 둔다.

  • 핵심 키워드: 격리성, 직렬 가능성, 동시성과 일관성의 trade-off, 이상 현상(Anomaly)
  • SQL 표준의 4단계: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE
  • 설정 예: SET TRANSACTION ISOLATION LEVEL READ COMMITTED (문법은 DBMS마다 조금씩 다르다)

이상 현상은 읽은 시점과 상대 트랜잭션이 커밋한 시점이 어긋나서 생긴다

이상 현상 발생 상황 결과
Dirty Read T2가 커밋하지 않은 변경을 T1이 읽음 T2가 롤백하면 T1은 존재한 적 없는 값을 사용
Non-Repeatable Read T1이 같은 행을 두 번 읽는 사이 T2가 그 행을 수정·커밋 같은 질의인데 값이 달라짐
Phantom Read T1이 같은 조건으로 두 번 조회하는 사이 T2가 조건에 맞는 행을 삽입·삭제하고 커밋 행의 개수나 집계가 달라짐

Non-Repeatable Read는 기존 행의 값이 바뀌는 경우이고, Phantom Read는 조건에 걸리는 행 집합 자체가 바뀌는 경우다. 두 개념을 섞어 쓰는 답안이 많아서 이 구분은 꼭 짚어 두는 편이 좋다.

4단계는 허용하는 이상 현상의 범위로 구분한다

격리 수준 Dirty Read Non-Repeatable Read Phantom Read
READ UNCOMMITTED 발생 가능 발생 가능 발생 가능
READ COMMITTED 방지 발생 가능 발생 가능
REPEATABLE READ 방지 방지 발생 가능(표준 기준)
SERIALIZABLE 방지 방지 방지

위 표는 SQL 표준이 말하는 최소 보장이다. 실제 DBMS는 표준보다 강하게 구현하기도 해서, 예를 들어 PostgreSQL의 REPEATABLE READ는 스냅샷을 쓰기 때문에 Phantom Read도 막는다. 시험에서는 표준 표를, 실무에서는 사용하는 DBMS 문서를 기준으로 삼는다.

그림 1. Non-Repeatable Read 개념도. 직접 그린 설명용 그림이며 실측 데이터가 아니다.

락 기반과 MVCC는 같은 격리 수준을 서로 다른 방식으로 구현한다

구현 방식 원리 장점 한계
락 기반(2PL 계열) 읽기에 공유 락, 쓰기에 배타 락을 걸고 보유 기간으로 수준을 조절 동작이 단순하고 최신 값을 읽음 읽기와 쓰기가 서로 대기하고 교착상태 위험이 커짐
MVCC(다중 버전) 변경 시 이전 버전을 남기고, 읽는 쪽은 기준 시점의 스냅샷을 읽음 읽기가 쓰기를 막지 않아 동시성이 높음 이전 버전 보관 공간이 필요하고, 갱신 충돌은 별도로 처리해야 함

기본 격리 수준은 제품마다 다르다. Oracle, PostgreSQL, SQL Server는 READ COMMITTED가, MySQL InnoDB는 REPEATABLE READ가 기본이다. 한 문항에서 기본값을 묻는다면 “DBMS마다 다르다”는 점과 대표 사례를 함께 쓰면 된다.

같은 잔액을 두 번 읽는 트랜잭션은 수준에 따라 다른 값을 본다

잔액 100,000원인 계좌를 가정한다. T1이 잔액을 조회하고, 그 사이 T2가 30,000원을 인출해 커밋한 뒤, T1이 다시 조회한다.

  1. Dirty Read: T2가 커밋 전 70,000원(100,000 − 30,000)을 만들고 T1이 READ UNCOMMITTED로 읽었다. T2가 롤백하면 실제 잔액은 100,000원인데 T1은 70,000원을 들고 있다.
  2. Non-Repeatable Read: READ COMMITTED에서는 1차 100,000원, 2차 70,000원으로 값이 달라진다. REPEATABLE READ에서는 2차도 100,000원이다.
  3. Phantom Read: 주문 금액 10,000·20,000·30,000원의 합계는 60,000원이다. T2가 15,000원짜리 주문을 삽입해 커밋하면 다시 집계했을 때 75,000원이 된다. 표준 기준의 REPEATABLE READ는 이를 막지 못한다.

답안에는 표준 정의와 DBMS 구현을 구분해 쓰고 격리 수준을 올릴 때의 비용을 함께 적는다

  • 정의 → 이상 현상 3종 → 4단계 표 → 구현 방식(락, MVCC) 순서로 쓰면 흐름이 자연스럽다.
  • 수준을 올릴수록 일관성은 좋아지지만 대기, 교착상태, 롤백 재시도가 늘어난다. 그래서 대부분의 서비스는 기본값을 쓰고 필요한 구간만 강화한다.
  • 재고 차감처럼 정합성이 중요한 곳은 전체 수준을 올리기보다 SELECT ... FOR UPDATE 같은 명시적 락이나 낙관적 락(버전 컬럼)을 쓰는 방식이 흔하다.
  • Lost Update, Write Skew 같은 이상 현상은 표준 3종과 별개로 논의되므로, 여유가 있으면 한 줄 언급한다.

시험 직전 한 줄 요약

격리 수준은 위로 갈수록 Dirty → Non-Repeatable → Phantom 순으로 이상 현상을 막고, 대신 동시성을 내어 준다.

이 글은 학습용 정리이며 실제 시험 문항과 다를 수 있다. 출제 기준은 한국데이터산업진흥원, 큐넷 등 공식 공지를 확인하라. 그림은 개념도이며 실측 데이터가 아니다.

zerg96

Recent Posts

2026년 11월 은행FP 시험 일정 (접수·시험·발표)

11월에 일정이 있는 은행FP 시험을 정리했습니다. 접수, 시험, 합격 발표 날짜를 한 번에 볼 수…

34분 ago

배당수익률·배당성향·배당락 계산, 배당 3%가 세후 실제로 얼마인지 따져 보기 (주식 기초)

배당은 회사가 번 이익을 주주에게 현금으로 나눠 주는 일이다. "배당수익률 3%"라는 숫자는 매력적으로 보이지만 세금,…

4시간 ago

PER·PBR·ROE 관계 정리, PBR = PER × ROE로 읽는 저평가의 함정과 계산 예시 (주식 기초)

주식 기사나 증권사 리포트에서 가장 자주 만나는 지표가 PER, PBR, ROE이다. 따로 외우면 숫자의 나열에…

4시간 ago

엑셀 조건 집계 함수 정리, SUMIF·SUMIFS·COUNTIFS 인수 순서와 SUMPRODUCT 비교 (컴퓨터활용능력)

컴퓨터활용능력 스프레드시트 파트에서는 조건에 맞는 값만 합치고 세는 문제가 거의 매 회차 나온다. SUMIF 계열…

4시간 ago

엑셀 VLOOKUP 근삿값(TRUE)과 정확히 일치(FALSE) 차이, INDEX·MATCH로 왼쪽 값 찾기 (컴퓨터활용능력)

엑셀에서 값을 찾아 가져오는 함수 가운데 VLOOKUP은 컴퓨터활용능력 필기·실기 모두에서 가장 자주 나오는 함수이다. 문제의…

4시간 ago

COCOMO 비용 산정 정리, 유기형·반분리형·내장형 계수와 32KLOC 노력·기간 계산 (정보처리기사)

프로젝트를 시작하기 전에 "몇 명이 몇 달 일해야 하나"를 대략 가늠하는 일이 소프트웨어 비용 산정이다.…

4시간 ago