CS/DB

[데이터베이스] 트랜잭션 격리 수준(Transaction Isolation Level)

BongChun 2023. 7. 18. 16:56

트랜잭션 격리 수준(Transaction Isolation Level)이란?

데이터베이스에서 동시에 여러 트랜잭션이 수행될 때 발생하는 이상 현상에 대한 허용 수준이라고 볼 수 있다.

제약이 없을수록 제약사항이 없기 때문에 트랜잭션의 처리량은 증가하지만, 데이터의 불일치가 발생할 가능성인 높아진다. 트랜잭션의 동시성 문제를 발생하지 않도록 막을 수 있지만, 제약사항이 많아지고 처리할 수 있는 트랜잭션의 수가 줄어들어 DB의 처리량이 크게 하락하게 된다.

 

따라서 사용자가 트랜잭션으로 발생할 수 있는 문제들을 인식하고, 필요에 의해서 적절히 사용할 수 있도록 레벨을 나누었는데 그것이 트랜잭션 격리 수준(Transaction Isolation Level)이다.

 

SQL:1992 표준에서 제시한 트랜잭션 격리 수준은 다음과 같은 4가지로 분류된다.

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPREATABLE READ
  • SERIALIZABLE

 

트랜잭션이 수행될 때 발생할 수 있는 이상현상에 대해 알아보고, Isolation Level까지 알아보도록 하자.

발생할 수 있는 이상 현상

Dirty read

커밋되지 않은 변경을 읽는 현상이다. 아직 완료되지 않은 트랜잭션 작업의 변경 사항을 보고 사용하기 때문에 예상치 못한 결과가 발생할 수 있다.

 

예를 들어, A 트랜잭션이 사용중인 데이터에 B 트랜잭션이 값을 사용할 수 있다. A 트랜잭션이 아직 커밋을 하지 않은 상황에 값을 읽기 때문에 문제가 발생할 수 있다.

Non-Repeatable Read

한 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때 다른 결과가 나오는 현상을 의미한다. 중간에 다른 트랜잭션이 값을 변경하고 커밋할 때 발생한다.

 

예를 들어, 다른 트랜잭션이 사용 중인 데이터를 처음 조회했을 때와 이후에 조회했을 때 다른 결과를 반환할 수 있다.

Phantom Read

한 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때, 없었던 새로운 레코드가 추가되는 현상을 말한다. 중간에 다른 트랜잭션에서 새로운 레코드를 추가하고 커밋할 때 발생한다.

 

예를 들어, 사용중인 데이터에 다른 트랜잭션이 삽입, 수정 등의 명령을 수행해 이전에 없던 데이터가 추가되는 현상이 발생할 수 있다.

 

그 외에도 발생할 수 있는 이상 현상

  • Dirty write
  • Lost update
  • Read skew
  • Write skew

 

추가 이상현상 외에도 Dirty read, Non-repeatable read, Phantom read에서 더 발생할 수 있는 확장된 문제들이 더 존재한다.

 

대표적인 문제들에 대해서 좀 더 자세히 정리를 했지만 추가로 발생할 수 있는 이상 현상에 대해서도 알아두면 도움이 될 것 같다. 각 DBMS마다 Isolation Level의 각 레벨의 기준이 다를 수 있기 때문에, 해당하는 문제를 파악하여 필요한 레벨을 알맞게 사용할 수 있어야 한다.

Isolation Level

Isolation Level

Read uncommitted

트랜잭션의 커밋 여부와 상관없이 데이터에 접근할 수 있는 격리 수준입니다. 데이터의 부정합이 발생할 확률이 높지만 가장 성능이 빠르다.

 

해당 격리 수준에선 Dirty read, Non-repeatable read, Phantom read가 발생할 수 있다.

Read committed

커밋이 완료된 시점 데이터만 다른 트랜잭션이 접근할 수 있게 허용하는 격리 수준이다. 데이터가 이미 다른 트랜잭션에 의해 사용되고 있다면 트랜잭션이 종료될 때까지 접근할 수 없다.

 

가장 기본적인 격리 수준이고 MySQL의 InnoDB도 Read committed를 기본적인 격리 수준으로 사용한다.

 

A 트랜잭션이 해당 데이터를 사용중일 때, A 트랜잭션이 트랜잭션을 시도하기 전의 데이터를 읽어오게 된다. 만약 A 트랜잭션이 해당 데이터를 변경하고 커밋을 했을 경우 다른 트랜잭션에서 값을 삽입하거나 수정했을 수 있기 때문에 Non-Repreated read와 Phantom read가 발생할 수 있다.

Repeatable read

행을 조회할 때 같은 데이터를 반환하는 것을 보장하는 격리 수준이다. 하지만 새로운 행이 추가될 수 있어 Phantom read가 발생할 수 있다.

Serializable

사용중인 테이블을 다른 트랜잭션이 접근하지 못하도록 잠궈 발생하는 모든 문제를 해결할 수 있다. 락을 거는 것이기 때문에 이상 현상이 발생하지 않아 데이터베이스의 정합성을 만족한다. 하지만 동시에 접근할 수 없기 때문에 가장 성능이 떨어진다.

References