본문 바로가기
Database

데이터베이스 트랜잭션 격리수준(Isolation Level)와 문제점 예시 정리

by rkdxodid 2025. 1. 9.

  🔎 트랜잭션의 격리수준이란 ?

  • 트랜잭션의 4가지 특징, ACID중 고립성(isolation)을 보장하기 위해서는 트랜잭션은 분리 되어야 한다.
  • 트랜잭션 격리수준이란 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것이다.

 격리수준은 크게 아래의 4개로 나뉜다.

  • READ UNCOMMITTED (커밋되지 않은 읽기)
  • READ COMMITTED (커밋된 읽기)
  • REPEATABLE READ (반복 가능한 읽기)
  • SERIALIZABLE (직렬화 가능)

 

👉 1. READ UNCOMMITTED (커밋되지 않은 읽기)

각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관 없이 다른 트랜잭션에서 값을 읽을 수 있다.

  • 정합성에 문제가 많음
  • Dirty Read 발생

Dirty Read란?

트랜잭션이 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게 되는 현상

ex) 업데이트만 하고 commit을 하지 않아도 변경된 데이터가 보인다

 

 

👉 2. READ COMMITTED (커밋된 읽기)

COMMIT 된 데이터만 읽습니다.

  • RDB에서 대부분 기본적으로 사용하고 있는 격리 수준 (PostgreSQL, Oracle, Microsoft SQL Server, IBM Db2)
  • NON-Repeatable 발생

NON-Repeatable란?

하나의 트랜잭션 내에서 동일한 SELECT 쿼리를 실행했을 때 항상 같은 결과를 보장해야 한다는 REPEATABLE READ 정합성에 어긋나는 것

  • 예시
    1. B에서 ‘Number’ 테이블을 조회 해서 1이 나왔다.
    2. A 가 ‘Number’ 테이블에 1을 2로 update 후 커밋을 한다.
    3. B에서 다시 테이블을 조회했을 때, 2가 나온다.
      1. 트랜잭션 B 내부에서 동일한 SELECT 쿼리에서 서로 다른 결과가 반환되어 데이터 정합성이 어긋하게 된다.
    4.  

👉 3. REPEATABLE READ (반복 가능한 읽기)

자신의 트랜잭션이 생성되기 이전의 트랜잭션에서 COMMIT 이 된 데이터만 읽습니다.

  • MySQL과 MariaDB 가 기본으로 사용하는 격리 수준이다.
  • MySQL에서는 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 된다.
  • PHANTOM READ 발생

🔎 3.1 추가 설명

MySQL 뿐만이 아니라 여러 DB들이 이 방식을 사용한다.

 

모든 트랜잭션은 번호를 갖진다. undo 영역에서는 트랜잭션 번호를 함께 보관한다.

  • 트랜잭션은 자신보다 낮은 트랜잭션 번호에서 커밋된 데이터만 읽습니다.
  1. 트랜잭션 A는 10번이고 Number를 조회하여 1이 나옴
  2. 트랜잭션 B에서 Number를 2로 변경하여 커밋함 (11번)
  3. 트랜잭션은 다시 조회 sql을 보내서 커밋하지 않는 이상 1을 조회함

PHANTOM READ란?

한 트랜잭션에서 동일한 쿼리를 여러 번 실행했을 때, 다른 트랜잭션이 데이터를 추가하거나 삭제함으로 인해 결과가 달라지는 현상

  • 예시
    • 트랜잭션 A가 시작됩니다 (트랜잭션 번호: 10).
      • Number 값을 조회하면 1이 반환됩니다 (트랜잭션 A가 시작되기 전에 커밋된 데이터 기준).
    • 트랜잭션 B가 시작되고 (트랜잭션 번호: 11), Number 값을 2로 변경하고 COMMIT합니다.
      • 이제 데이터베이스의 최신 Number 값은 2가 됩니다.
    • 트랜잭션 A가 다시 Number를 조회합니다.
      • 트랜잭션 A는 트랜잭션 10 이전의 데이터 스냅샷을 참조하므로 여전히 Number 값이 1로 보입니다.
      • 이는 트랜잭션 A가 종료(커밋 또는 롤백)될 때까지 동일한 값을 유지합니다.
간단히 조회한 후에 수정 됬음 → 조회 query가 커밋되기 전까지 수정 되기 전 값으로 보임

 

 

👉 4. SERIALIZABLE (직렬화 가능)

데이터를 접근할 때, 항상 Lock을 걸고 데이터를 조회

  • 단순하지만 가장 엄격한 격리 수준
  • 문제가 발생하지 않음
  • 성능 이슈로 데이터베이스에서 거의 사용하지 않는다.

 

참고

https://mangkyu.tistory.com/299
https://velog.io/@yujiniii/데이터베이스-트랜잭션-격리-수준
https://akasai.space/db/about_isolation/

 

'Database' 카테고리의 다른 글

슬로우 쿼리를 잡자! EXPLAIN, EXPLAIN ANALYZE  (1) 2024.11.13
DBMS의 핵심? 옵티마이저  (1) 2024.11.06
VARCHAR와 TEXT의 저장방식 차이  (1) 2024.10.22
SQLite 사용기  (0) 2024.10.21