스물두줄

정보관리기술사 · 개념서 · 데이터베이스

트랜잭션 격리 수준

설명 영상 트랜잭션 격리 수준 · 2:14

왜 배우는가: 트랜잭션 격리 수준은 동시에 실행되는 트랜잭션이 서로 얼마나 간섭하는지를 정하는 기준이며, 동시성과 데이터 일관성 사이의 트레이드오프를 결정한다. 실무에서 성능 저하, 교착상태, 잘못된 조회 결과 같은 문제의 원인이 대부분 격리 수준 선택에 있다. 시험에서는 4가지 수준과 이상 현상의 대응 관계를 묻는 문제가 반복해서 출제된다.

출제 이력: 제137회 3교시 4번, 제134회 2교시 6번, 제119회 1교시 13번

1. 한 줄 정의와 핵심 키워드

트랜잭션 격리 수준은 동시에 실행되는 트랜잭션 사이의 간섭을 제어하는 정도로, 읽기 작업에서 허용할 이상 현상의 범위를 정한 기준이다.

핵심 키워드: 트랜잭션 격리 수준(Transaction Isolation Level), 고립성(Isolation), Dirty Read, Non-repeatable Read, Phantom Read, 직렬화 가능성(Serializability), 스냅숏 격리(Snapshot Isolation), MVCC(Multi-Version Concurrency Control)

2. 개념 풀이

쉬운 말로 하면, 여러 사용자가 같은 데이터를 동시에 바꾸고 읽을 때 한 트랜잭션이 다른 트랜잭션의 작업을 어디까지 보게 할지를 정하는 설정이다. 격리 수준을 높이면 결과는 안정되지만 대기가 늘고, 낮추면 동시 처리량은 늘지만 이상 현상이 생길 수 있다.

정식 정의는 다음과 같다. 고립성(Isolation)은 ACID 특성 중 하나로, 동시에 실행되는 트랜잭션의 효과가 각 트랜잭션을 순차적으로 실행한 것과 같은 수준으로 보장되는 정도를 말한다. 격리 수준은 이 보장의 세기를 SQL 표준이 4단계로 나눈 것이다.

READ UNCOMMITTED는 커밋되지 않은 변경도 읽는 수준이다. 다른 트랜잭션이 롤백하면 실제로 존재하지 않았던 값을 읽게 되므로 Dirty Read가 발생한다.

READ COMMITTED는 커밋된 데이터만 읽는 수준이다. Dirty Read는 막지만, 같은 트랜잭션에서 같은 행을 두 번 읽을 때 중간에 커밋된 값이 바뀔 수 있어 Non-repeatable Read가 생긴다.

REPEATABLE READ는 트랜잭션 안에서 이미 읽은 행의 값을 다시 읽어도 같게 보장하는 수준이다. 행 값의 변화는 막지만, 새로 삽입된 행까지 막지는 못하므로 Phantom Read가 남을 수 있다.

SERIALIZABLE은 트랜잭션들이 하나씩 순서대로 실행된 것과 같은 결과를 보장하는 가장 높은 수준이다. 세 가지 이상 현상이 모두 막히지만 동시성이 가장 낮다.

이 네 수준은 SQL 표준의 정의이며, 실제 DBMS는 잠금(Lock) 방식이나 MVCC 방식으로 구현한다. 그래서 같은 이름이라도 제품마다 막는 이상 현상의 범위가 다르다. 예를 들어 DBMS마다 격리 수준의 제공 방식이 다를 수 있다.

3. 등장 배경과 필요성

다중 사용자 데이터베이스에서 여러 트랜잭션이 같은 데이터를 동시에 처리하면, 직렬로 실행할 때는 생기지 않던 문제가 나타난다. 모든 트랜잭션을 한 번에 하나씩 실행하면 안전하지만 처리량이 크게 떨어진다. 그래서 일관성을 어느 정도 양보하는 대신 동시성을 얻을 방법으로 격리 수준이 도입되었다.

초기 데이터베이스는 잠금으로 격리를 구현했다. 읽기 잠금과 쓰기 잠금을 오래 쥐고 있으면 격리 수준은 높아지지만 대기와 교착상태가 늘어난다. 이 문제를 줄이려고 짧은 잠금이나 버전 기반 읽기 방식이 등장했고, 격리 수준은 이 구현 방식과 함께 발전했다.

이어지는 내용

로그인하면 하루 5페이지까지 무료로 전체를 읽을 수 있습니다.

앱에서 이 단원 읽기