본문 바로가기
데이터베이스

트랜잭션 격리수준

by wwns 2023. 9. 9.
반응형

이전 글에서 트랜잭션에 대해서 알아보았다

트랜잭션은 데이터베이스 상태를 변환하는 작업의 단위를 말하며 연산들의 묶음이라고 하였다

트랜잭션의 특징 4가지 ACID를 정리하면서 트랜잭션을 잘 설계하지 못하면 동시성 문제가 발생할 수 있음을 알 수 있었다

그에 따라 트랜잭션에서는 동시성 문제가 자주 발생할 수 있는 혹은 자주 발생하진 않지만 동시성 문제가 중요한 상황에서 이를 보장해 주기 위해 격리 수준을 설정할 수 있다

 

격리 수준을 설정하는 것은 Lock을 건다는 것인데 DBMS에서는 락을 거는 대신 로그를 이용해 동시성 문제를 하는 방법도 있다

MVCC를 알아보기 전에 트랜잭션 격리수준을 정리하며 Lock 메커니즘을 이해해 본다

 


트랜잭션 격리성

트랜잭션의 특징 중 격리성이 존재했다

격리성이란 

  • 동시에 실행되는 둘 이상의 트랜잭션이 서로 영향을 미치면 안된다

격리성이 보장되지 않는다면 데이터 일관성이 깨지는 문제가 발생한다

이를 세 가지 상황으로 구분 지을 수 있다

 

Dirty Read

  • 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 내용을 읽을 수 있다
    • 다른 트랜잭션이 롤백하거나 변경 내용을 커밋하지 않은 상태에서 데이터를 읽으면 데이터의 일관성이 깨진다

Non Repeatable Read

  • 한 트랜잭션이 동일한 데이터 조회 쿼리를 두 번 이상 실행하고 중간에 다른 트랜잭션이 해당 데이터를 변경하면, 두 번의 읽기에서 다른 결과를 얻을 수 있다
    • 동일한 데이터에 대한 연속적인 읽기에서 일관성이 깨질 수 있다

Phantom Read

  • 한 트랜잭션 중에 다른 트랜잭션에 의해 새로운 행이 삽입, 삭제되면 같은 쿼리를 실행했을 때 결과가 다를 수 있다
    • 동일한 범위 내에서 쿼리를 실행할 때 결과가 변경되어 일관성이 깨질 수 있다

격리성을 보장하지 못하면 위와 같은 세 가지 상황에 데이터 일관성이 깨질 수 있음을 알 수 있다

 


트랜잭션 격리 수준

동시성으로 인해 격리성을 보장하지 못하는 상황이 발생할 수 있다

낮은 동시성을 제공하게 되면 데이터 일관성을 깨뜨리지 않고 격리성을 보장할 수 있으나

성능이 저하되기에 일관성과 동시성은 Trade off로 제어할 수 있다

  • 일관성이 깨질 위험을 줄이려면 낮은 동시성을 제공해야한다
  • 높은 동시성을 제공하면 일관성이 깨질 위험이 증가한다

 

 

Read Uncommitted

  • 커밋되지 않은 트랜잭션의 변경 내용을 다른 트랜잭션이 조회하는 것을 허용
  • 데이터 부정합 문제가 발생할 확률이 가장 높지만, 가장 빠르다
  • 데이터의 일관성이 중요하지 않고 요청이 많은 상황에서 적합할 수 있을 것 같다

위에서 설명한 세 가지 문제 상황이 발생할 수 있다

 

Read Committed

  • 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 읽을 수 있다
  • 특정 트랜잭션이 이루어지는 동안 다른 트랜잭션에서 접근할 수 없음

특정 트랜잭션이 커밋하지 않고 데이터를 변경했을 때 트랜잭션2가 데이터를 읽고, 트랜잭션1이 커밋했을 때 트랜잭션2가 다시 데이터를 읽으면 변경된 데이터를 읽으므로 Non Repeatable Read, Phantom Read 문제는 여전히 존재

 

Repeatable Read

  • 특정 행을 조회할 시 항상 같은 데이터를 응답하는 것을 보장하는 격리 수준
  • 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제하는 것을 불허하여 같은 데이터를 두 번 쿼리 했을 때 일관성 있는 결과를 반환

행이 추가되는 것을 막지 않기 때문에 Phantom Read가 발생할 수 있음

 

Serializable Read

  • Repeatable Read와 마찬가지로 후행 트랜잭션이 갱신하거나 삭제하는 것을 막을 뿐 아니라, 선행 트랜잭션이 사용 중인 테이블의 모든 행을 다른 트랜잭션이 접근하지 못하도록 잠가 새로운 레코드 삽입 또한 막아준다
  • 테이블에 대한 락이 걸려 SELECT 쿼리조차 수행할 수 없다
  • 동시성에 대한 성능이 매우 떨어진다


정리

  • 트랜잭션에서 격리성이 보장되지 않는다면 어떤 상황들이 발생할 수 있나요?
    • 다른 트랜잭션이 영향을 미치게 되면서 데이터 일관성이 깨질 수 있습니다
  • 데이터 일관성이 깨지는 상황을 설명해 주세요
    • 한 트랜잭션이 아직 커밋되지 않은 트랜잭션의 변경사항을 읽는 Drity Read 상황이 발생할 수 있습니다
    • 한 트랜잭션이 같은 데이터를 조회하는 쿼리를 두 번 이상 실행하고, 중간에 다른 트랜잭션의 데이터 변경이 반영되면 두 번의 읽기에서 다른 결과가 반환되는 Non Repeatable Read 상황이 발생할 수 있습니다
    • 한 트랜잭션 중에 다른 트랜잭션에 의해 행이 삽입되거나 삭제되면 첫 트랜잭션의 처음과 끝에서 같은 쿼리 결과가 달라지는 Phantom Read 상황이 발생할 수 있습니다
  • 트랜잭션 격리 수준에 대해서 설명해 주세요
    • Read Uncommitted
      • 커밋되지 않은 트랜잭션의 변경 내용을 다른 트랜잭션이 조회하는 것을 허용
    • Read Committed
      • 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 읽을 수 있도록 허용
    • Repeatable Read
      • 특정 행을 조회할 시 항상 같은 데이터를 응답하는 것을 보장
    • Serializable Read
      • 선행 트랜잭션이 사용 중인 테이블의 모든 행을 다른 트랜잭션이 접근하지 못하도록 잠그는 격리 수준

Reference

https://hudi.blog/transaction-isolation-level/#:~:text=%EC%B2%A8%EB%B6%80%ED%95%B4%EB%91%90%EC%97%88%EB%8B%A4.-,%EB%8D%94%ED%8B%B0%20%EB%A6%AC%EB%93%9C%20(Dirty%20Read),%EC%88%98%20%EC%9E%88%EB%8A%94%20%EB%AC%B8%EC%A0%9C%EB%A5%BC%20%EB%A7%90%ED%95%9C%EB%8B%A4. 

 

데이터베이스 트랜잭션 격리 수준과 격리 수준에 따른 문제점

이 포스팅은 우아한테크코스 4기 2022 CS Plant 스터디에서 기술 면접을 대비하기 위해 작성되었습니다. 트랜잭션 격리 수준 복수개의 트랜잭션이 한번에 처리될 때, 특정 트랜잭션이 변경하거나

hudi.blog

 

반응형

'데이터베이스' 카테고리의 다른 글

테이블 조인  (1) 2023.09.13
동시성 제어와 Snapshot Isolation  (0) 2023.09.11
트랜잭션  (0) 2023.09.07
데이터베이스 반정규화  (1) 2023.09.06
데이터베이스 정규화  (0) 2023.09.06