Isolation level

2020-04-20

Isolation level이란 무엇인가?

트랜잭션에서 일관성이 없는 데이터를 허용하도록 하는 수준

ANSI에서 작성된 SQL-92 표준은 4가지 Transaction Isolation Level 정의

  • Read Uncommitted

  • Read Committed

  • Repeatable Read

  • Serializable

Isolation level 조정은 동시성이 증가되는데 반해 데이터 무결성에 문제가 발생할 수 있고,

데이터의 무결성을 유지하는 데 반해 동시성이 떨어질 수 있다.


Isolation Level 의 필요성

데이터베이스는 ACID 같이 트랜잭션이 원자적이면서도 독립적인 수행을 하도록 한다.

그래서 Locking 이라는 개념이 등장한다.

트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하게 막는 것

하지만 무조건적인 Locking으로 동시에 수행되는 많은 트랜잭션들을 순서대로 처리하는 방식으로 구현되면 DB의 성능은 떨어지게 된다.

반대로 응답성을 높이기 위해 Locking 범위를 줄인다면 잘못된 값이 처리 될 여지가 있다.


A. Read Uncommited Isolation Level (레벨 0)

  • SELECT 문장을 수행하는 경우 해당 데이터에 shared lock이 걸리지 않는 레벨.

  • 트랜잭션에 처리중인 혹은 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용

  • 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안

다른 사용자는 B라는 아직 완료되지 않은(Uncommitted 혹은 Dirty) 데이터 B를 읽을 수 있다.
(Commit이 이루어진 트랜잭션만 조회 가능)

  • Dirty read, Non-repeatable read, Phantom read 현상 발생

B. Read Committed Isolation Level (레벨 1)

  • SELECT 문장이 수행되는 동안 해당 데이터에 shared lock이 걸리는 레벨.

  • dirty read 방지 : 트랜잭션이 커밋되어 확정된 데이터만을 읽는 것을 허용

  • 어떠한 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 해당 데이터에 접근할 수 없다.

  • DB2, SQL Server, Sybase의 경우 읽기 공유 lock을 이용해서 구현,

하나의 레코드를 읽을 때 lock을 설정하고 해당 레코드에서 빠지는 순간 lock해제

  • Non-repeatable read, Phantom read 현상 발생

    C. Repeatable Read Isolation Level (레벨 2)

  • 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로

다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능하다.

  • 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제하는 것을

불허함으로써 같은 데이터를 두 번 쿼리했을 때 일관성 있는 결과를 리턴함

  • DB2, SQL Server의 경우 읽은 데이터에 걸린 공유 lock을 커밋할 때까지 유지하는 방식으로 구현

  • Oracle은 이 레벨을 명시적으로 지원하지 않지만 for update절을 이용해 구현 가능

  • SELECT col FROM a WHERE col1 BETWEEN 1 AND 10 을 수행하였고 결과는 두 건의 데이터 출력(col1 = 1 ,5).

다른 사용자가 col1이 1이나 5인 row에 대한 update는 불가능하다. 이를 제외한 나머지 범위에 해당하는 row를 insert하는 것은 가능.

  • Phantom read 현상 발생

    D. Serializable Isolation Level (레벨 3)

  • SELECT 수행 시 READ LOCK, 즉 shared lock을 사용

  • 완벽한 읽기 일관성 모드를 제공

  • 데이터의 일관성 및 동시성을 위해 MVCC(Multi Version Concurrency Control)을 사용하지 않음

(MVCC는 다중 사용자 데이터베이스 성능을 위한 기술로 데이터 조회 시 LOCK을 사용하지 않고

데이터의 버전을 관리해 데이터의 일관성 및 동시성을 높이는 기술)

  • 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는

그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다.


낮은 단계의 트랜잭션 고립화 수준 이용시 발생하는 현상 3가지

  • Dirty Read (=Uncommitted Dependency)

커밋되지 않은 수정 중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생

어떤 트랜잭션에서 아직 실행이 끝난지 않은 다른 트랜잭션에 의한 변경 사항을 보게 되는 되는 경우

  • Non-Repeatable Read (=Inconsistent Analysis)

한 트랜잭션 내에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제함으로써

두 쿼리의 결과가 상이하게 나타나는 비 일관성 발생

  • Phantom Read

한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽을 때, 첫 번째 쿼리에서 없던 레코드가 두 번째 쿼리에서 나타나는 현상.

이는 트랜잭션 도중 새로운 레코드가 삽입되는 것을 허용하기 때문에 나타남.

```