트랜잭션 격리수준 (Isolation Level)

목차

📌 트랜잭션 격리수준이란

트랜잭션 격리 수준이란 동시에 여러개의 트랜잭션 처리를 할 때 각 트랜잭션끼리 얼마나 고립 되어 있는지를 나타낸다.

데이터 베이스에서 여러개의 트랜잭션이 공유 자원 에 접근해 작업(CRUD) 을 할때 자원의 일관성 을 지키기 위해 트랜잭션 작업을 얼마나 고립시킬지를 나타냅니다.

격리 수준이 높을 수록 무결성은 강해지지만, 성능이 저하됩니다. 그렇다고 격리수준을 낮추면 성능과 관련된 동시성은 높아지지만 데이터 무결성이 깨질 수 있어 데이터 성격에 따라 적절한 설정이 필요합니다.

📋 트랜잭션 격리 수준

1. Read Uncommited - 커밋되지 않은 데이터만 읽기

현재 트랜잭션에서 일어난 변경 사항이 Commit 이나 Rollback 되지 않아도 다른 트랜잭션에서 변경된 값을 읽을 수 있다.

  • Dirty Read 현상이 발생
    • Commit 이 일어나기 전에 발생한 변경사항을 다른 Transaction 에서 조회할 수 있는 현상

2. Read Commited - 커밋된 데이터만 읽기

다른 트랜잭션에서 일어난 변경 사항이 Commit되지 않았으면 Undo 영역 에 저장된 데이터를 읽어온다.

  • Dirty Read 가 발생하지 않는다.
  • Non-Repeatable Read 현상이 발생한다.
    • 한 트랜잭션 내에서 같은 데이터를 두번 조회 했을 때 이전 데이터와 일치 하지 않는 데이터 불일치 현상

3. Repeatable Read - 반복적으로 동일한 데이터를 읽기

트랜잭션 ID 를 이용해 현재 트랜잭션보다 이전에 일어난 변경사항 만 조회할 수 있다.
즉, 트랜잭션 내에서 조회한 데이터는 트랜잭션 종료 시점 까지 같은 데이터를 반환한다.

  • Phantom Read 가 발생한다.
    • 한 트랜잭션 내에서 같은 데이터를 두번 조회 했을 때 이전에 존재하지 않았던 값이 다시 조회했을 때 나타나는 현상
    • Repeatable Read 의 경우 특정행의 수정과 삭제가 일어나더라도 일관성을 유지하지만, 특정 행이 아닌 테이블에 새로운 행의 삽입은 막을 수가 없어 발생하는 문제입니다.
    • 트랜잭션 도중에 데이터 삽입(Insert) 을 허용하기 때문에 발생하는 문제
    • REPETABLE READ 이하에서만 발생한다

4. Serializable

가장 높은 격리 수준, 읽기 작업에도 Lock이 걸리게 된다.

  • 데이터를 조회할때 Shared Lock 을 획득해야만 조회할 수 있다.
  • 데이터를 변경할때는 Exclusive Lock 을 획득해야만 변경할 수 있다.

🚧 격리 수준에 따른 문제

Dirty Read Non-Repeatable Read Phantom Read
Read Uncommited 발생 발생 발생
Read Commited 발생하지 않음 발생 발생
Repeatable Raead 발생하지 않음 발생하지 않음 발생
Serializable 발생하지 않음 발생하지 않음 발생하지 않음
  • Dirty Read (더러운 읽기)
    • 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽는 행위
  • Non-repeatable Read (반복 불가능한 읽기)
    • 같은 쿼리를 여러 번 실행했을 때 결과가 달라지는 현상.
  • Phantom Read (팬텀 리드)
    • 동일한 조건으로 여러 번 조회할 때 새로운 row 가 나타나는 현상.
Share