본문 바로가기

학습 기록 (Learning Logs)/CS Study

isolation level

 

 


공통 질문

데이터 불일치 문제 발생
1. Dirty read
2. Non-repeatable read || Fuzzy read
3. Phantom read

ANSI SQL에서 정의된 격리 수준 4단계
1. READ UNCOMMITTED
2. READ COMMITTED
3. REPEATABLE READ
4. SERIALIZABLE

기존 논문 비판
1. Dirty Write
2. Lost Update
3. Read skew
4. Write skew
5. dirty read 다른 예제
6. Phantom read 다른 예제

추가 격리 수준
snapshot isolation


실무에서 isolation level
1. mysql
2. oracle
3. sql server
4. postgreSQL

 

 


 

출처:

https://www.youtube.com/watch?v=bLLarZTrebU

 


데이터 불일치 문제 발생

1. Dirty read

commit하지 않은 데이터를 읽어서 데이터에 문제가 발생함

유효하지 않은 값을 읽어서 commit함

 

 

2. Non-repeatable read || Fuzzy read

x의 값이 읽을 때 마다 변경됨

 

 

3. Phantom read

없던 데이터가 생김

 

 

 

 

데이터 불일치를 해결하려면, db성능이 낮아진다.

 


Isolation Level (격리 수준)

 

  • application 설계자는 isolation level을 통해, 전체 처리량, 데이터 일관성 사이에서 trade를 할 수 있다.
  • 데이터베이스 트랜잭션이 다른 트랜잭션과 얼마나 격리될 것인지를 결정하는 설정.
  • 읽기(Read)와 쓰기(Write)가 동시에 수행될 때 **동시성 제어(Concurrency Control)**를 위해 사용됨.

 


ANSI SQL에서 정의된 격리 수준 4단계:

READ UNCOMMITTED → 읽기와 쓰기가 완전히 허용됨(Dirty Read 가능).

READ COMMITTED → 쓰기 중인 데이터를 다른 트랜잭션에서 읽지 못함.

REPEATABLE READ → 읽는 동안 다른 트랜잭션이 해당 데이터를 변경할 수 없음.

SERIALIZABLE → 완전한 트랜잭션 격리(가장 높은 수준).

 

 


기존 논문 비판

 

 


1. Dirty Write

rollback 시 정상적인 recovery는 매우 중요하기 때문에, 모든 isolation level에서는 dirty write를 허용하면 안된다.

 

transaction2가 commit까지했어도, transaction1에 의해서 값이 변경됨.

 

 

2. Lost Update

transaction2 내용이 사라짐

 

 

 

3. Read skew

inconsistent한 데이터 읽기

 

데이터의 정합성이 깨짐

 

 

4. Write skew

제약 사항 위반함

 

5. dirty read 다른 예제

abort가 발생하지 않아도, dirty read가 발생할 수 있다

 

데이터의 정합성이 깨짐

 

 

6. Phantom read 다른 예제

팬텀 리드가 발생하는 확장적으로 바라보자

읽은 값이 달라졌던 것을 팬텀 리드라고 한다

transaction1에서 cnt 0으로 와야하는데 1로 리턴옴

 

 


isolation level 추가

+ snapshot isolation 

 

lost update가 발생하겠지..

 

y값이 다르네? abort함


실무에서 isolation level

개발자는 사용하는 RDBMS의 isolation level을 잘 파악해서, 적절한 isolation level을 사용 해야 한다.

 

1. mysql

4개 제공

 

 

2. oracle

실제적으로 read committed, serializable 두개만 가능

serializable: snapshot 처럼 작동함

 

 

3. sql server

 

 

4. postgreSQL

repeatable read : snapshot isolation

 

 

 

 

 


출처: https://www.youtube.com/watch?v=DwRN24nWbEc

 

schedule

여러 transaction들이 동시에 실행될 때, 각 transaction에 속한 operation들의 실행 순서

- 각 transaction 내의 operation들의 순서는 바뀌지 않는다

 

 

Serial schedule

- transaction들이 겹치지 않고, 한 번에 하나씩 실행되는 schedule

 

성능

- 한번 수행할때 하나의 transaction만 수행한다

 


Non-Serial schedule

- transaction들이 겹쳐서 실행되는 schedule

 

 

성능

 

단점

 

 


 

 


Conflict

 

read-write conflict

 

 

write-write conflict

 

 

 

 

 

conflict equivalent

 

 

스케쥴3, 스케쥴2는 conflict equvalent 하다!

 

Conflict serializable

스케쥴2: serializable schedule

스케쥴3: non-serializable schedule

 

 

 


스케쥴4, 스케쥴2는 순서가 다름

순서의 역전

 


 


출처: https://www.youtube.com/watch?v=89TZbhmo8zk

 

 

 


Un-recoverable schedule

- 회복 불가능하기 때문에 애초에 허용하면 안된다

 


Recoverable schedule

- schedule 내에서 그 어떤 transaction도 자신이 읽은 data를 write한 transaction이

- 먼저 commit/rollback하기 전까지는 commit하지 않는다

 

 

의존성이 있을때

 

Cascading rollback

- 하나의 transaction이 rollback을 하면, 의존성이 있는 다른 transaction도 rollback을 한다

 

 

Cascadeless schedule

- schedule 내에서 어떤 transaction도 commit되지 않은 transaction들이 write한 data를 읽지 않는다

 

 

개선 전

 

개선 후

 

 

 

 

 

 

Cascadeless schedule 문제점

 

 

Strict schedule

- rollback 할때, recovery가 쉽다

- transaction 이전 상태로 돌려놓기만 하면 된다


 

읽기 전용(Read-Only Mode)

 

  • 데이터베이스가 쓰기 작업을 허용하지 않고 읽기만 가능하도록 설정.
  • 주로 백업용 DB, 보고서용 DB(Read Replica)에서 사용.

읽기-쓰기(Read-Write Mode)

기본적인 DB 모드로, 읽기 및 쓰기 작업이 모두 가능.

 

 

 


읽기/쓰기 설정을 활용한 DB 운영 방식

Primary-Replica 구조 (Master-Slave)

  • Primary(또는 Master) → 읽기/쓰기 가능.
  • Replica(또는 Slave) → 읽기 전용.
  • 트래픽이 많은 경우 읽기 전용 Replica를 추가하여 부하를 분산.
  • MySQL, PostgreSQL에서 흔히 사용됨.

 

Multi-Master Replication

  • 여러 개의 DB 인스턴스가 모두 읽기/쓰기 가능.
  • 분산 데이터베이스 환경에서 사용 (예: Galera Cluster, CockroachDB)

 

SQLite WAL(Write-Ahead Logging) 모드

  • 기본적으로 SQLite는 읽기와 쓰기를 동시에 할 수 없지만, WAL 모드를 사용하면 읽기/쓰기 병행 가능.

 

'학습 기록 (Learning Logs) > CS Study' 카테고리의 다른 글

database  (0) 2025.02.06
transaction  (0) 2025.02.03
SQLite  (0) 2025.02.03
Tree  (0) 2025.02.03
WAL(Write-Ahead Logging)  (0) 2025.02.03