본문 바로가기

개발/Backend

[database] transaction isolation level

Isolation level

Isolation level 이란 여러 사용자가 동일한 데이터를 동시에 수정하려고 할 때 발생하는 상황을 정확하게 정의할 수 있도록 제공하는 기능 중 하나로, 아래 세 개의 수준을 가진다

표준 SQL 트랜잭션 격리 수준에는 Read uncommitted 도 포함되지만 PostgreSQL에서는 지원하지 않는다 (다중 버전 동시성 제어를 구현하는 경우는 이 수준을 지원할 수 없기 때문)

또 PostgreSQL의 Repeatable Read 에서는 phantom read가 불가능하다

  • level 1 Read Committed
  • level 2 Repeatable Read
  • level 3 Serializable

대부분의 DBMS에서는 Read Committed를 기본으로 설정한다

 격리 수준 dirty read nonrepeatable read phantom read
Read committed 불가능 가능 가능
Repeatable read 불가능 불가능 가능
Serializable 불가능 불가능 불가능

 

  • dirty read
    • 한 트랜잭션은 다른 트랜잭션에 아직 커밋하지 않은 자료도 읽을 수 있음
  • nonrepeatable read
    • 한 트랜잭션은 다른 트랜잭션에서 커밋한 자료를 읽을 수 있음
    • 예를 들어, 처음에 어떤 데이터를 읽고, 다시 그 데이터를 읽으려고 하는데, 그 사이 다른 트랜잭션에서 데이터를 변경하고 커밋 했다면, 그 다음에 읽는 값이 커밋된 값으로 읽을 수 있음
  • phantom read
    • 위와 같은 상황에서 다른 트랜잭션에서 커밋된 데이터가 있다고 하더라도, 항상 자신의 트랜잭션에서 조회했던 데이터 값을 그대로 보여준다

Read Committed: 커밋된 읽기 격리 수준

  • PostgreSQL 기본 격리 수준 & 대부분읜 DBMS가 기본으로 설정하는 수준
  • Dirty read를 방지하여 트랜잭션이 된 데이터를 읽는 것을 허용함
  • PostgreSQL에서 구문 상으로는 Read Uncommitted 격리 수준을 사용할 수 있지만, 내부적으로는 Read Committed 격리 수준으로 처리됨

Repeatable Read: 반복 가능한 읽기 격리 수준

  • 항상 동일한 데이터의 응답을 보장하는 격리 수준
  • Read Committed 의 경우, 하나의 row 조회 후, 다시 조회 했을 때, 다른 트랜잭션에서 해당 데이터가 갱신될 수 있기 때문에 데이터가 동일하다는 보장을 해주지 못하는 경우(Nonrepeatable read)가 생김
  • 이러한 Nonrepeatable read가 불가능한 상태의 격리 수준
  • 언제 조회해도 처음에 조회한 데이터와 동일한 데이터를 받을 수 있음

Serializable: 직렬화 가능한 격리 수준

  • 가장 높은 격리 수준
  • 모든 작업을 하나의 트랜잭션에서 처리하여 동시성 처리 효율은 떨어짐
  • 위 두 격리 수준들에서는 하나의 트랜잭션 안에서 update 명령 후 조회하니 다른 값이 보이거나 데이터가 사라지는 경우(Phantom Read)가 생길 수 있음
  • 예를 들어 첫번째 트랜잭션에서 업데이트를 하고 두번째 트랜잭션에서 업데이트 작업이 일어난 후 첫번째 트랜잭션에서 커밋을 하고 나면 두 번째 트랜잭션에서는 에러 발생 ⇒ 이 때에는 자체적으로 재시도 등의 처리 필요

추가

  • 커넥션이 유지되는 동안에만 격리 수준 변경하기: 링크

'개발 > Backend' 카테고리의 다른 글

HTTP/3, HTTP over QUIC  (0) 2022.07.24
프로세스(Process)와 스레드(Thread)  (0) 2021.08.15
[redis] redis의 데이터 타입  (0) 2021.06.17
[chrome dev summit 2021] Payment and address form best practices  (0) 2021.06.10
[kafka] Kafka란  (0) 2021.01.28