본문 바로가기
CS/DB

[DB] 트랜잭션 격리 수준(isolation level)

by 원만사 2022. 2. 8.
반응형

목차

    1. 트랜잭션의 특성 ACID

     트랜잭션을 성공적으로 처리하여 데이터베이스의 무결성과 일관성을 보장하기 위해서는

    (1) 원자성 (Atomicity)

    (2) 일관성 (Consistency)

    (3) 격리성 (Isolation)

    (4) 지속성 (Durability)

     

    의 4가지 특성을 만족해야 한다. 이중 격리성을 보장하기 위해서 모든 트랜잭션을 순차적으로 실행하면 동시성 처리 이슈가 발생한다. 반대로 동시성을 높이기 위해 여러 트랜잭션을 병렬처리하게 되면 데이터의 무결성이 깨질 수 있다. 

     

     따라서, 트랜잭션들을 병행 수행하면서 격리성을 보장하기 위해 ANSI 표준은 트랜잭션의 격리 수준을 4단계로 나누어 정의하고 있다. 

     

    2. 트랜잭션 격리 수준 

     트랜잭션의 격리 수준(isolation level)이란 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것이다. 

     

     격리 수준은 4가지로 정의할 수 있다.

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

     READ UNCOMMITTED의 격리 수준이 가장 낮고 SERIALIZABLE로 갈수록 점점 격리 수준이 높아진다. 격리 수준이 높아질수록 발생하는 문제는 적어지지만 동시 처리 성능은 떨어진다. 각 격리 수준에 따라 발생하는 문제점들을 표로 나타내면 다음과 같다. 

     

    격리 수준 DIRTY READ NON-REPEATABLE READ PHANTOM READ
    READ UNCOMMITTED O O O
    READ COMMITTED - O O
    REPEATABLE READ - - O
    SERIALIZABLE - - -

     

     이제 각각의 격리 수준과 격리 수준에 따라서 발생하는 문제점들에 대해서 알아보자.

     

    2-1. READ UNCOMMITTED (Level 0)

    • 각 트랜잭션의 변경 내용이 COMMIT / ROLLBACK 여부에 상관없이 다른 트랜잭션이 값을 읽을 수 있다.
    • 정합성에 문제가 많은 격리 수준이기 때문에 일반적으로 사용 되지 않는다.
    • 만약 Transaction1에서 변경 내용을 ROLLBACK 하더라도 Transaction2는 이를 알지 못하고 222에 해당하는 값이 존재한다고 판단하고 계속해서 처리하게 된다.

     READ UNCOMMITTED에서 발생하는 대표적인 문제는 Dirty Read이다. Dirty Read란 트랜잭션에서 처리한 작업이 완료되지 않았음에도 불구하고 다른 트랜잭션에서 해당 변경사항을 보게되는 경우를 말한다. 이는 데이터가 나타났다가 사라졌다 하는 현상을 초래할 수 있다. 이러한 Dirty Read 문제를 해결하기 위해서는 READ COMMITTED 격리 수준을 사용한다.

     

    2-2. READ COMMITTED (Level 1)

     

    • 오라클 DBMS에서 기본적으로 사용되고 있으며 온라인 서비스에서 가장 많이 선택되는 격리 수준이다.
    • 어떤 트랜잭션에서 변경한 내용이 커밋되기 전까지는 다른 트랜잭션에서 해당 변경 내용을 조회할 수 없다.
    • 실제 테이블에서 값을 가져오는 것이 아니라, Undo 영역의 백업된 레코드에서 값을 가져온다. 
    • 그렇기 때문에 Dirty Read와 같은 현상은 일어나지 않는다. 

     

     READ COMMITTED에서 발생하는 문제는 NON-REPEATABLE READ라는 부정합 문제가 있다. 이는 하나의 트랜잭션 내에서 동일한 SELECT 쿼리를 실행했을 때 항상 같은 결과를 보장해야 한다는 "REPEATABLE READ" 정합성에 어긋나는 문제이다.

     위의 예제에서 Transaction2가 222에 대한 값을 조회했을 때 Busan이라는 값을 가져왔다. 하지만 Transaction1이 Commit된 후 다시 한 번 222에 대한 값을 조회하면 Jeju라는 값을 가져오게 된다. 하나의 트랜잭션 안에서 같은 222에 대해서 조회했지만 한 번은 Busan을 가져왔고 다른 한 번은 Jeju를 가져와 정합성에 어긋나게 된다.

     

     이러한 NON-REPEATABLE READ 문제를 해결하기 위해서 REPETABLE READ 격리 수준을 사용한다.

     

    2-3. REPETABLE READ (Level 2)

    • MySQL의 InnoDB 스토리지 엔진에서 기본적으로 사용되는 격리 수준이다. 
    • NON-REPEATABLE READ 부정합이 발생하지 않는다.
    • 트랜잭션마다 트랜잭션 ID를 부여하여 해당 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 된다.
    • Undo 공간에 백업해두고 실제 레코드 값을 변경한다. 
    • 백업된 데이터는 불필요하다고 판단하는 시점에 주기적으로 삭제한다.
    • Undo에 백업된 레코드가 많아지면,MySQL 서버의 처리 성능이 떨어질 수 있다.
    • 이와 같은 방식을 MVCC(Multi-Version Concurrency Control, 다중 버전 동시성 제어)라고 한다.
    MVCC란?
    - 하나의 트랜잭션에서 데이터에 접근하는 경우 데이터의 다중버전 상태 중 보장되는 버전에 맞는 값을 반환하여 처리하는 방법을 의미한다. 

     

     REPEATABLE READ 격리 수준에서는 PHANTOM READ 문제가 발생할 수 있다. 이는 한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때, 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안보였다가 하는 현상을 말한다. 

     

    2-4. SERIALIZABLE (Level 3)

    • 한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근할 수 없게 하는 격리 수준
    • 가장 단순하면서 가장 엄격한 격리 수준이다.
    • 동시 처리 성능은 다른 트랜잭션 격리 수준 보다 현저히 떨어진다.

     

    3. 정리

    ※ 트랜잭션 격리 수준

    • READ UNCOMMITTED : 트랜잭션내에서 커밋하지 않은 데이터에 다른 트랜잭션의 접근이 가능
    • READ COMMITTED : 트랜잭션내에서 커밋된 데이터만 다른 트랜잭션이 읽는 것을 허용
    • REPEATBALE READ : 트랜잭션 내에서 한 번 조회한 데이터를 반복해서 조회해도 결과는 동일
    • SERIALIZABLE : 가장 엄격한 격리 수준으로 완벽한 읽기 일관성 모드 제공 

     

    ※ 격리 수준에 따라 발생할 수 있는 문제점

    • DIRTY READ : 어떠한 트랜잭션 내에서 처리한 작업이 완료되지 않았음에도 불구하고 다른 트랜잭션에서 볼 수 있게 되는 현상
    • NON-REPEATABLE READ : 동일한 SELECT 쿼리를 실행했을 때 항상 같은 결과를 보장해야 한다는 "REPEATABLE READ" 정합성에 어긋나는 현상
    • PHANTOM READ : 한 트랜잭션 내에서 동일한 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 존재하지 않던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상

     

     

     

    REFERENCES

    - https://zzang9ha.tistory.com/381

    - https://medium.com/@sunnkis/database-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EC%9D%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80%EC%9D%B4%EB%9E%80-10224b7b7c0e

    - https://mozi.tistory.com/561

    - https://gyoogle.dev/blog/computer-science/data-base/Transaction%20Isolation%20Level.html

     

     

     

     

    반응형

    댓글