본문 바로가기

CS 백엔드/데이터베이스

[DB] 트랜잭션의 격리수준

1. 트랜잭션 격리 수준

  • 동시에 DB에 접근할 때 그 접근을 어떻게 제어할지에 대한 설정
  • 레벨(고립도)이 높아질수록 고립도가 올라가서 더 확실한 처리가 가능해지지만 동시에 수행될 수 있는 트랜잭션을 순서대로 처리하게 되어 속도가 느려지게 된다.

 

 

2. 트랜잭션의 격리 수준 단계

(1) Read Uncommitted

  • 트랜잭션에서 처리 중인 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
  • SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는다.

발생할 수 있는  문제점

  • Dirty Read
  • Non-Repeatable Read
  • Phantom Read

 

(2) Read Committed

  • 트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용한다.

발생할 수 있는  문제점

  • Non-Repeatable Read
  • Phantom Read

 

(3) Repeatable Read

  • 트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지해 준다.
  • 트랜잭션이 완료될 때까지 SELECT 문장이 사용되는 모든 데이터에 Shared Lock이 걸린다.
  • 다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대한 수정 이 불가능하다.

발생할 수 있는  문제점

  • Phantom Read

 

(4) Serializable Read

  • 한 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근 불가
  • 트랜잭션이 완료될 때까지 SELECT 문장이 사용되는 모든 데이터에 Shared Lock이 걸린다.
  • 다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대한 수정 및 입력 이 불가능하다.

 

 

3. 낮은 단계의 트랜잭션 격리 수준을 사용할 때 발생하는 현상

  • Dirty Read
    • 다른 트랜잭션에 의해 수정은 되었지만 커밋이 되지 않은 데이터를 읽는 것
    • 다른 트랜잭션이 커밋이 되기 전에 롤백이 된다면 데이터의 비일관성을 가짐
  • Non-Repeatable Read
    • 한 트랜잭션에서 같은 쿼리를 두 번 수행했을 때, 두 쿼리의 결과가 다르게 나오는 비일관성 현상
    • 다른 트랜잭션에서 커밋 전의 데이터를 읽는 쿼리를 수행한 결과와 다른 트랜잭션에서 커밋이 완료된 데이터를 읽는 쿼리를 수행한 결과가 다르게 나옴

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

 

'CS 백엔드 > 데이터베이스' 카테고리의 다른 글

[DB] INDEX 인덱스  (0) 2023.02.03
[DB] SQL과 NoSQL  (0) 2023.02.03
[DB] 트랜잭션  (0) 2023.02.01
[DB] 데이터 베이스 정규화  (0) 2023.01.30
[DB] 데이터 베이스(Database)의 기본  (0) 2023.01.29