DBMS Transaction의 Isolation Level(고립화 수준)

    Isolation Level의 필요성


    DBMS를 혼자서 사용한다면 문제가 없겠지만, 대부분의 프로그램이 여러명이 사용하고 있으며 상대방이 변경된 부분이 반영이 안되거나 혹은 반영이 이상하게 되어서 화면상의 데이터가 꼬이는 문제등이 발생하게 된다. 내가 실행하고 있는 이 트랜잭션 안에서 중간에 다른 트랜잭션의 결과가 반영이 되어, 치명적인 연산 버그등이 발생하게 되면 이미 사용할 수 없는 수준으로 폐기처리 해야 할 것이다.


    예를 들어, A라는 값이 1000이라는 값이 있고, B라는 값이 2000이라는 값이 있는데 처음 시작했을 때, A+B를 해서 3000이라는 값을 저장하였다. 그러나 다른 트랜잭션이 A의 값을 1500으로 변경하여, 마지막에 한번 더 A+B를 해서 3500으로 변경이 되었다면 처음과 마지막의 연산값이 틀려서 문제가 발생할 것이다.


    이러한 문제를 방지하기 위해서는 고립화 수준(Isolation Level)을 올려야 한다. 




    Isolation Level의 개념 및 특징


    가. ACID 속성을 보장하기 위한 Isolation Level의 개념

    - 트랜잭션 실행 중 중간 연산 결과가 다른 트랜잭션으로 접근 불가하도록하는 고립성을 유지하기 위한 데이터를 허용하는 수준

    - 트랜잭션에서 일관성이 없는 데이터를 허용하도록 하는 수준



    나. Isolation Level의 특징

    • ANSI / ISO SQL Standard : SQL-92 표준에서 4단계로 표준화, DBMS 벤더들이 준수
    • ACID 보장 : 트랜잭션의 속성인 ACID를 만족하기 위한 설정
    • Locking 기반 : 각각의 설정은 Locking 기술을 기반으로 Isolation Level을 조정



    병행제어 미처리 시 문제 유형(직렬성 위반 내용)


    1) 부정판독(Dirty Read)

    - Commit 되지 않은 데이터를 읽을 수 있음

    - 다른 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 데이터를 읽는 것

    - 트랜잭션 T1이 특정 행(ROW)의 갱신을 수행하고 난 후, T2가 그 행을 검색한 뒤 T1이 취소된다고 가정하면 트랜잭션 T2는 더 이상 존재하지 않는, 그리고 결코 존재하지 않았던 행을 본 것이 됨



    2) 비반복판독(Nonrepeatable Read)

    - Commit 된 데이터만 읽음

    - 최초 읽은 값고 다시 읽었을 때의 값이 다를 수 있음

    - 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하여 두 쿼리 결과가 다르게 나타나는 현상

    - 트랜잭션 T1이 한 행을 검색하고 T2가 그 행을 갱신한 뒤 T1이 동일한 행을 다시 검색한다고 가정하면, 트랜잭션 T1은 “동일” 한 행을 두 번 검색한 것이지만 두 개의 다른 값을 보게 됨



    3) 가상 판독(Phantom Read)

    - 특정 범위 값을 읽고 나서 다시 읽었을 때 없었던 새로운 행을 읽을 수 있음

    - 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 없던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상

    - 트랜잭션 T1이 특정 조건을 만족하는 모든 행을 검색한다고 하자. 그런 다음 트랜잭션 T2는 동일한 조건을 만족하는 새로운 행을 삽입한다고 할 때 트랜잭션 T1이 검색 요구를 반복한다면, 이전에는 존재하지 않았던 한 행을 보게 됨




    Isolation Level의 유형


    1) Read Uncommitted

    - 트랜잭션에서 처리중인, 아직 COMMIT 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용

    - SELECT 문장 수행하는 경우 해당 데이터에 Shared Lock이 걸리지 않는 Level 

    - 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 B라는 아직 완료되지 않은(Uncommitted 혹은 Dirty) 데이터 B를 읽을 수 있음

    - 직렬성 위반 : Dirty Read, Nonrepeatable Read, Phantom Read



    2) Read Committed

    - 트랜잭션이 COMMIT 되어 확정된 데이터만 읽는 것을 허용

    - 대부분의 DBMS가 사용하는 Default Isolation Level (Mysql 은 Repeatable Read가 Default)

    - 다른 사용자가 완료한(Committed) 데이터만 읽음

    - DBMS별로 Shared Lock이 걸리거나, 걸리지 않을 수 있음

    - 직렬성 위반 : Nonrepeatable Read, Phantom Read



    3) Repeatable Read

    - 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신, 삭제하는 것 불허

    - 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸림

    - 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능함

    - 직렬성 위반 : Phantom Read



    4) Serializable

    - 선행 트랜잭션이 읽은 데이터를 후행 트랜잭션이 갱신하거나 삭제하지 못할 뿐 아니라, 중간에 새로운 레코드를 삽입하는 것도 막아줌

    - Repeatable Read 수준에서 범위에 대한 Shared Lock 추가

    - 직렬성 위반 : 발생불가



    Isolation Level 수준과 비일관성 현상


    - 특별히 리소스에 대한 배타적 접근이 요구되는 경우 적절한 Isolation을 선정하여 사용하는 것이 필요함



    Consistency(일관성)와 Concurrency(병행성, 동시성)



    ※ 트랜잭션 고립화 수준을 높이면 일관성은 향상 되지만 더 넓은 범위의 Lock을 더 오랫동안 유지하는 방식으로 동시성을 저하

    댓글

    Designed by JB FACTORY