RECENT POSTS

최근에 작성한 글

01 / 03

전체 글

전체 보기

[CS] 데이터베이스 트랜잭션 격리 수준과 스택 & 큐

1. 데이터베이스 트랜잭션 격리 수준

1. 트랜잭션 격리 수준이란?

여러 트랜잭션이 동시에 실행될 때 각 트랜잭션이 다른 트랜잭션의 변경 내용을 어느 정도까지 볼 수 있도록 허용할 것인지를 결정하는 기준

 

격리 수준이 높아질수록 데이터의 일관성은 높아지지만 동시에 처리할 수 있는 트랜잭션이 줄어들어 성능이 저하될 수 있다.

 

즉, 동시성과 데이터 일관성 사이의 트레이드오프를 고려하여 적절한 격리 수준을 선택해야 한다.

격리 수준  Dirty Read Non-repeatable Read Phantom Read
READ UNCOMMITTED 발생 가능 발생 가능 발생 가능
READ COMMITTED 방지 발생 가능 발생 가능
REPEATABLE READ 방지 방지 발생 가능
SERIALIZABLE 방지 방지 방지

2. READ UNCOMMITTED

가장 낮은 격리 수준으로 다른 트랜잭션에서 아직 Commit하지 않은 데이터까지 읽을 수 있다.

Transaction A가 아직 Commit하지 않았는데 Transaction B가 변경된 5000을 읽었다.

 

이후 Transaction A가 Rollback하면 실제 데이터는 원래 값으로 돌아가므로 Transaction B는 실제로 확정되지 않은 데이터를 읽은 것이 된다.

 

이를 Dirty Read라고 한다.

 

Dirty Read

다른 트랜잭션에서 Commit되지 않은 데이터를 읽는 현상

READ UNCOMMITTED는 동시성은 높지만 데이터 정합성 문제가 발생할 가능성이 높다.

3. READ COMMITTED

다른 트랜잭션에서 Commit이 완료된 데이터만 읽을 수 있는 격리 수준이다.

따라서 Dirty Read는 발생하지 않는다.

 

하지만 하나의 트랜잭션에서 같은 데이터를 두 번 조회했을 때 서로 다른 결과가 나타날 수 있다.


Transaction A는 동일한 트랜잭션 안에서 동일한 데이터를 조회했지만 처음에는 10000, 두 번째에는 5000을 조회했다.

이를 Non-repeatable Read라고 한다.

 

Non-repeatable Read

하나의 트랜잭션에서 같은 행을 여러 번 조회했을 때 다른 결과가 나타나는 현상

중간에 다른 트랜잭션이 해당 데이터를 수정하고 Commit했기 때문에 발생한다.

4. REPEATABLE READ

하나의 트랜잭션에서 같은 데이터를 여러 번 조회해도 동일한 결과를 보장하는 격리 수준이다.

따라서 Dirty Read와 Non-repeatable Read를 방지한다.

 

하지만 SQL 표준상 다른 트랜잭션에서 새로운 행을 추가하거나 삭제하면서 조회되는 행의 집합 자체가 달라지는 Phantom Read가 발생할 수 있다.


같은 조건으로 조회했지만 처음에는 5개의 행이 조회되고 이후에는 6개의 행이 조회된다.

 

Phantom Read

하나의 트랜잭션에서 동일한 조건으로 여러 번 조회했을 때 이전에는 없었던 행이 나타나거나 기존 행이 사라지는 현상

 

Non-repeatable Read가 하나의 행의 값이 변경되는 문제라면 Phantom Read는 조회되는 행의 집합이 변경되는 문제라는 차이가 있다.

MySQL InnoDB의 REPEATABLE READ는 MVCC와 Next-Key Lock 등의 구현으로 일반적인 SQL 표준의 REPEATABLE READ보다 강한 일관성을 제공하므로, 상황에 따라 Phantom Read를 방지할 수 있다.

5. SERIALIZABLE

가장 높은 격리 수준이다.

여러 트랜잭션이 동시에 실행되더라도 마치 트랜잭션을 순차적으로 실행한 것과 같은 결과를 보장한다.

따라서 다음 문제를 모두 방지할 수 있다.

  • Dirty Read
  • Non-repeatable Read
  • Phantom Read

하지만 트랜잭션 간 충돌을 강하게 제어하기 때문에 대기 시간이 증가하고 동시 처리 성능이 낮아질 수 있다.

따라서 높은 수준의 데이터 정합성이 필요한 상황에서 고려할 수 있다.

6. 격리 수준 정리

격리 수준은 다음과 같이 높아진다.

READ UNCOMMITTED
        ↓
READ COMMITTED
        ↓
REPEATABLE READ
        ↓
SERIALIZABLE

 

격리 수준이 높아질수록 일반적으로 다음과 같은 특징이 있다.

데이터 일관성 ↑
동시성 ↓
성능 비용 ↑

 

따라서 무조건 가장 높은 격리 수준을 사용하는 것이 좋은 것은 아니며 서비스에서 요구하는 데이터 정합성과 동시성을 고려하여 적절한 수준을 선택해야 한다.