ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Isolation Level
    STUDY/DB 2023. 4. 25. 23:06

    Isolation Level이란?

     

    데이터베이스 트랜잭션 처리에서의 격리 수준을 의미하며, 동시에 수행되는 여러 트랜잭션들이 서로 영향을 주지 않도록 데이터베이스 시스템에서 제공하는 기술이다. 이를 통해 동시성과 일관성 사이의 균형을 조절할 수 있다.

     

     

    1. READ UNCOMMITTED(읽기 미완료)

     

    가장 낮은 격리 수준으로, 트랜잭션들이 아직 커밋되지 않은 데이터를 읽을 수 있다. 이로 인해 dirty read, non-repeatable, phantom read와 같은 문제가 발생할 수 있다.

     

    [예] 트랜잭션A가 어떤 값을 x에서 y로 변경하고 아직 커밋하지 않은 상황에서 트랜잭션B가 해당 값을 읽을 경우 트랜잭션B에 y가 조회되는 것이다. 하지만 속도가 빠르기 때문에 데이터의 일관성이 떨어지더라도, 성능 극대화를 위해 의도적으로 사용하기도 한다. 

     

    2. READ COMMITTED(읽기 완료)

     

    해당 격리 수준에서 트랜잭션들은 커밋되지 않은 데이터를 읽을 수 없지만, 읽어온 데이터에 대한 수정은 가능하다. 따라서 한 트랜잭션이 동일 데이터를 두 번 읽을 때, 그 사이에 다른 트랜잭션이 데이터를 수정하는 경우 다른 결과를 얻을 수 있다. READ UNCOMMITTED와 달리 dirty read 문제는 해결되지만, 여전히 non-repeatable read와 phantom read 문제는 발생할 수 있다. 충돌 가능성이 적은 트랜잭션 환경에 적합하다.

     

    [예] 트랜잭션 B가 어떤 데이터를 읽을 때 트랜잭션A가 해당 데이터에 대한 업데이트를 커밋하면, 트랜잭션B는 변경 사항을 보지 않고 커밋 이전 데이터를 읽는다. 하지만 트랜잭션B가 해당 데이터를 두 번 조회할 경우 첫번째 조회가 끝나고 두번째 조회가 이루어지는 사이에 트랜잭션A가 해당 데이터를 수정해서 커밋하면 트랜잭션B는 두번째 조회에서 수정된 값을 조회하게 된다.

     

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

     

    해당 격리 수준에서는 트랜잭션동안 동일한 데이터를 반복해서 읽을 수 있도록 한다. 즉, 트랜잭션이 읽은 ROW를 다른 트랜잭션에서 수정되는 것을 막아주는 것이다. 하지만 다른 트랜잭션에서 새로운 ROW를 추가하는 것은 제한하지 않는다. 따라서 non-repeatable read는 해결되지만, phantom read 문제는 발생할 수 있다.

     

    [예] 트랜잭션A가 어떤 값을 두번 조회할 때 그 과정에서 중간에 트랜잭션B가 해당값을 수정하려하지만, 이미 트랜잭션A가 읽은 로우이기 때문에 수정이 이루어지지 않아서 트랜잭션A는 두번 모두 일정한 값을 조회할 수 있다.

     

    4. SERIALIZABLE(직렬화 가능)

     

    가장 높은 격리 수준으로, 트랜잭션은 트랜잭션이 시작된 시점에 커밋된 변경 사항과 트랜잭션 자체에 의한 변경 사항만 볼 수 있다. 해당 격리 수준은 데이터베이스 내의 데이터를 수정하는 다른 트랜잭션이 존재하지 않는 것처럼 작동한다. 여러 트랜잭션이 동시에 같은 테이블 ROW에 접근하는 것을 막고, 트랜잭션 기간 동안 모든 쿼리는 동일한 결과를 반환하도록 보장된다. 또한 dirty read, non-repeatable, phantom read 문제를 모두 해결할 수 있다. 가장 안전한 격리 수준이지만, 동시성이 크게 감소할 수 있으므로 성능에 영향을 줄 수 있다.

     

    해당 격리 수준은 다음과 같은 환경에 적합하다.

    • 대규모 데이터베이스와 몇 개의 행만 업데이트하는 짧은 트랜잭션이 있는 경우
    • 동시에 실행되는 두 트랜잭션이 동일한 행을 수정할 가능성이 상대적으로 낮은 경우
    • 상대적으로 오래 실행되는 트랜잭션이 주로 읽기 전용인 경우

     

    [예] 트랜잭션 A가 어떤 값을 조회하는 동안 모든 데이터에 대해 shared lock이 걸려 트랜잭션B는 그 영역에 해당되는 데이터에 대한 추가 및 수정이 불가능하다.

     

    5. READ-ONLY(읽기 전용)

     

    Serializable 격리 수준과 유사하지만, 사용자가 SYS가 아닌 경우 트랜잭션에서 데이터를 수정할 수 없다. 트랜잭션 시작 시점에 대한 내용이 일관성을 유지해야 하는 경우에 유용하다.

     

     

     

    격리 수준에서 발생하는 문제

     

    •  Dirty Read

    Dirty Read는 한 트랜잭션(T1)이 다른 트랜잭션(T2)에서 아직 커밋되지 않은 데이터를 읽을 때 발생하는 문제이다. 이로 인해 T1은 일시적으로 존재하거나 롤백될 수 있는 데이터를 사용하게 되며, 무결성 문제가 발생할 수 있다.

     

    • Non-repeatable Read

    Non-repeatable Read는 한 트랜잭션(T1)이 동일한 데이터를 두 번 이상 읽을 때, 다른 트랜잭션(T2)에 의해 해당 데이터가 변경되어 T1이 다른 결과를 얻게 되는 문제이다. 트랜잭션 동안 일관성 없는 데이터를 사용하는 문제가 발생할 수 있다.

     

    • Phantom Read

    Phantom Read는 한 트랜잭션(T1) 내에서 특정 범위의 데이터를 두 번 이상 읽을 때, 다른 트랜잭션(T2)에 의해 해당 범위에 새로운 데이터가 추가되거나 삭제되어 T1이 다른 결과를 얻게 되는 문제이다. 트랜잭션 동안 데이터의 일관성이 깨질 수 있다.

     

     

     

    오라클에서 제공하는 Isolation Levels

    • Read Committed Isolation Level(기본)
    • Serializable Isolation Level
    • Read-Only Isolation Level

     

    'STUDY > DB' 카테고리의 다른 글

    Spring Transactional  (0) 2023.05.10
    Database Lock  (0) 2023.04.26
    실행계획  (0) 2023.04.19
    Join 방식  (0) 2023.04.13
    Index Scan  (0) 2023.04.12
Designed by Tistory.