ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DB Isolation(데이터베이스 격리)란?
    데이터 엔지니어링/SQL 2024. 11. 15. 21:17
    반응형

    데이터베이스 격리(Isolation)는 트랜잭션(transaction)에서 중요한 속성 중 하나로, 여러 트랜잭션이 동시에 실행될 때 서로 간섭하지 않고 독립적으로 실행되도록 보장하는 메커니즘입니다.

    이를 통해 데이터 일관성을 유지하고, 동시성 문제를 방지합니다. 격리 수준이 적절히 설정되지 않으면 트랜잭션 간에 충돌이 발생하거나 잘못된 데이터가 읽히는 등의 문제가 생길 수 있습니다.


    트랜잭션 격리의 중요성

    트랜잭션은 기본적으로 ACID 속성을 만족해야 합니다:

    • A(Atomicity): 트랜잭션은 모두 성공하거나, 전혀 실행되지 않음.
    • C(Consistency): 트랜잭션이 끝난 후 데이터의 상태가 일관성을 유지함.
    • I(Isolation): 각 트랜잭션이 독립적으로 실행됨.
    • D(Durability): 트랜잭션이 완료된 후 데이터는 영구적으로 저장됨.

    이 중 Isolation은 데이터베이스의 동시성 제어에 중점을 둡니다. 여러 사용자가 동일한 데이터를 동시에 액세스하더라도 논리적 충돌을 막는 데 핵심 역할을 합니다.


    DB Isolation 수준

    SQL 표준에서는 4가지 격리 수준을 정의하고 있으며, 이는 동시성 문제를 얼마나 허용하느냐에 따라 구분됩니다. 낮은 수준은 성능이 좋지만 데이터 정확성 문제가 발생할 가능성이 있습니다. 반대로 높은 수준은 데이터 일관성이 보장되지만 성능에 부담을 줄 수 있습니다.

    1️⃣ Read Uncommitted

    • 설명: 커밋되지 않은 데이터를 다른 트랜잭션이 읽을 수 있음.
    • 문제점: Dirty Read(더러운 읽기) 발생 가능.
      예: A 트랜잭션이 변경했지만 커밋하지 않은 데이터를 B 트랜잭션이 읽음.
    • 장점: 성능이 가장 뛰어남.
    • 사용 예시: 실시간 데이터를 비정확하게라도 빠르게 처리해야 할 때.

    2️⃣ Read Committed

    • 설명: 커밋된 데이터만 읽을 수 있음.
    • 문제점: Non-Repeatable Read(반복 불가능 읽기) 발생 가능.
      예: 같은 데이터를 두 번 조회했는데 값이 달라짐(A 트랜잭션 도중 B 트랜잭션이 수정 후 커밋).
    • 장점: 대부분의 실무에서 기본으로 사용.
    • 사용 예시: 주문 처리 시스템 등 대부분의 일반적인 트랜잭션.

    3️⃣ Repeatable Read

    • 설명: 트랜잭션이 시작된 후에는 다른 트랜잭션이 데이터를 수정할 수 없음.
    • 문제점: Phantom Read(유령 읽기) 발생 가능.
      예: WHERE 조건에 맞는 새로운 데이터가 다른 트랜잭션에 의해 추가되어 조회 결과가 달라짐.
    • 장점: 데이터 읽기의 일관성이 보장됨.
    • 사용 예시: 금융 시스템 등 데이터 정확성이 중요한 경우.

    4️⃣ Serializable

    • 설명: 트랜잭션이 완전히 직렬화(순차적으로 실행)된 것처럼 동작.
    • 문제점: 성능 저하.
    • 장점: 데이터 일관성을 완벽히 보장.
    • 사용 예시: 은행 계좌 송금 등 동시성 문제를 완전히 배제해야 하는 시스템.

    격리 수준과 동시성 문제

    격리 수준에 따라 아래와 같은 문제가 발생할 수 있습니다:


    격리 수준 Dirty  ReadNon-Repeatable  ReadPhantom Read
    Read Uncommitted O O O
    Read Committed X O O
    Repeatable Read X X O
    Serializable X X X
     
     

    DB Isolation의 예시

    1️⃣ Dirty Read 발생 예시 (Read Uncommitted)

    A 트랜잭션:

    UPDATE Account SET balance = balance - 100 WHERE id = 1;
    -- 트랜잭션 A가 아직 COMMIT하지 않음.

    B 트랜잭션:

    SELECT balance FROM Account WHERE id = 1;
    -- 트랜잭션 B는 커밋되지 않은 데이터를 읽음 (Dirty Read).

    만약 트랜잭션 A가 롤백(ROLLBACK)된다면 트랜잭션 B는 잘못된 데이터를 읽게 됩니다.


    2️⃣ Non-Repeatable Read 발생 예시 (Read Committed)

    A 트랜잭션:

    SELECT balance FROM Account WHERE id = 1;
    -- 잔액 1000 읽음.

    B 트랜잭션:

    UPDATE Account SET balance = 900 WHERE id = 1;
    COMMIT;

    A 트랜잭션 (다시 조회):

    SELECT balance FROM Account WHERE id = 1;
    -- 이번에는 잔액이 900으로 변경됨 (Non-Repeatable Read).

    3️⃣ Phantom Read 발생 예시 (Repeatable Read)

    A 트랜잭션:

    SELECT * FROM Orders WHERE amount > 100;
    -- 3개의 결과가 반환됨.

    B 트랜잭션:

    INSERT INTO Orders (id, amount) VALUES (4, 150);
    COMMIT;

    A 트랜잭션 (다시 조회):

    SELECT * FROM Orders WHERE amount > 100;
    -- 4개의 결과가 반환됨 (Phantom Read).

    결론

    • 데이터베이스의 격리 수준은 성능과 데이터 일관성 간의 트레이드오프를 의미합니다.
    • 적절한 격리 수준을 선택하는 것은 애플리케이션의 요구사항시스템 성능을 균형 있게 맞추는 것이 중요합니다.
    • 실무에서는 일반적으로 Read Committed 또는 Repeatable Read를 많이 사용하며, 상황에 따라 Serializable로 설정해야 할 경우도 있습니다.

     

     
     

     

     
    반응형

    댓글

Designed by Tistory.