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 |