본문 바로가기
IT 지식/데이터베이스

데이터 베이스의 고립화 단계(Isolation Level)

by 다빈치코딩 2023. 12. 6.

목차

    반응형

    데이터베이스 트랜잭션의 ACID 속성을 보장하기 위한 Isolation Level에 대해 알아보겠습니다. 데이터베이스를 혼자 사용한다면 아무 문제가 없겠지만 수많은 사람이 같이 사용하다보니 수많은 문제가 발생합니다. 

    어떤 트랜잭션에서 수정중인 중간 결과를 다른 트랜잭션이 접근하게 되면 Dirty Read, Non-Repeatable Read, Phantom Read등의 문제가 발생할 수 있습니다. 각각 어떤 상황에서 그런 문제가 발생하는지, 위에서 언급한 문제들은 무엇을 뜻하는지 알아보도록 하겠습니다.

    Read Uncommitted(Level 0)

    Read uncommitted 상태는 커밋을 하지 않은 데이터에 접근하는 것입니다. 


    예를 들어 위와 같이 DB에 좋아하는 음식을 저장해 놓았습니다. 홍길동은 파전을 좋아합니다. 여기에 추가로 전우치는 잡채를 좋아한다고 추가하였습니다. 이 때 새로운 사용자가 전우치가 좋아하는 음식을 조회 합니다. 커밋되지 않았지만 잡채라는 결과가 보이게 됩니다. 만약 이 작업이 롤백 된다면 더이상 잡채가 조회되지 않습니다. 이것을 Dirty Read라고 합니다. 

     

    Dirty Read
    트랜잭션이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게 되는 현상 입니다.

     

    따라서 커밋되지 않은 데이터를 다른 사용자에게 보여주면 안됩니다.

    Read Committed(Level 1)

    이제 커밋되지 않은 데이터는 보여주지 않도록 수정해보겠습니다. 그럼 모든 문제가 해결될 것 같습니다.

    홍길동이 파전을 좋아했지만 이제 잡채가 더 좋다고 합니다. 일단 파전을 잡채로 업데이트 하였지만 아직 커밋되지 않았습니다. 이 때 다른 사용자가 홍길동이 무엇을 좋아하는지 조회 합니다. 아직 커밋되지 않았기 때문에 이전 데이터인 파전이 조회됩니다.

    여기까지는 문제가 없습니다. 문제는 이 후에 발생합니다. 사용자1은 업데이트 된 잡채를 커밋을 합니다. 사용자2가 다시 조회를 한다면 이제는 커밋된 데이터인 잡채가 조회되는 것입니다. 이것을 Non-Repeatable Read 라고 합니다.

    Non Repeatable Read
    동일한 행을 두 번 검색할 때 다른 결과를 얻게 된다.

    이게 왜 문제가 되는지 생각해 보겠습니다. 여러 사람의 음식을 준비하느라 전체를 조회하고 추가적으로 개별 조회를 했다고 생각하면 이해하기 쉽습니다. 먼저 첫번째 조회로 모든 사람이 좋아하는 음식을 모두 준비하였습니다. 개별 조회로 홍길동이 무엇을 좋아하는지 다시 확인해보면 파전이 아닌 잡채가 좋아한다고 되어있어 미리 준비했던 파전은 갈곳을 잃고, 준비 못했던 잡채를 준비해야 합니다.

    Repeatable Read(Level 2)

    위와 같은 문제를 해결해 보겠습니다. 커밋된 기준으로 보여주는 것이 아니라 트랜잭션의 시작 기준으로 결과를 보여주면 문제가 해결될 것 같습니다. 나중에 시작한 트랜잭션이 커밋이 되었던 말던 현재 시점 기준으로만 제대로 보여준다면 위와같은 Non repeatable read 문제가 해결될것 같지만 또 다른 문제가 발생합니다.

    조금 복잡해 보일 수 있습니다. 원래 홍길동은 파전을 좋아합니다. 따라서 사용자2가 조회 할때 파전을 조회하게 됩니다. 이제 이것은 트랜잭션이 끝날때까지 변경되지 않습니다. 중간에 사용자1이 파전을 잡채로 변경하였지만 사용자2는 끝까지 파전으로 보입니다. 문제는 중간에 갈비를 추가한 것입니다. 처음 조회할 때에는 갈비가 없었는데 중간에 커밋된 갈비가 추가적으로 보이게 됩니다. 이것을 갑자기 튀어나온 유령 같다고 해서 Phantom Read라 합니다.

    Phantom Read
    같은 조회를 두 번 수행했을 때 첫 번째 조회에는 없던 유령 레코드가 두 번째 조회에서 나타나는 현상

    Serializable(Level 3)

    위에서 발생한 모든 것을 해결한 방식이 Serializable이라고 합니다. 가장 엄격한 수준의 격리로 위와 같이 여러 트랜잭션을 동시에 수행하는 것이 아니라 무조건 순차적으로 진행합니다. 첫 번째 트랜잭션이 끝나지 않았다면 다른 트랜잭션이 수행할 수 없습니다. 이런 격리 수준이기 때문에 어떠한 데이터 문제도 발생하지 않습니다. 하지만 순차적인 진행때문에 동시 처리 성능이 매우 떨어집니다. 

    즉 가장 안전하지만 가장 성능이 떨어져 실제 DB로는 제대로 된 역할을 하지 못합니다.

    정리

    고립성 단계가 높아질수록 일관성은 올라가지만 병행성을 떨어지게 됩니다. 이 기준은 ISO에서 정한 분류 기준일 뿐 모든 DBMS가 4가지 레벨을 전부 지원하지는 않습니다. 간단하게 트랜잭션의 고립화 단계(Isolation Level)에 대해 알아보았습니다. 

    반응형

    'IT 지식 > 데이터베이스' 카테고리의 다른 글

    CAP 이론  (0) 2023.12.14
    NoSQL(Not Only SQL)  (0) 2023.12.13
    LOD(Linked Open Data)  (0) 2023.12.12
    데이터베이스 정규화  (0) 2023.12.10
    데이터 베이스 이상현상(Anomaly)  (1) 2023.12.07