새소식

반응형
Development

[Transaction] 격리 수준(Isolation)

  • -
반응형

트랜잭션은 ACID를 보장해야 한다.

Atomicity, Consistency, Isolation, Durability 

이들 중에 이번에는 격리성에 대해서 알아보자

 

격리성

동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다.

예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다.

격리성은 동시성과 관련된 성능 이슈로 인해 격리 수준을 선택할 수 있다.

 

격리 수준

  • Read uncommitted : 커밋되지 않은 읽기
  • Read Commited : 커밋된 읽기
  • Repeatable Read : 반복 가능한 읽기
  • Serializable : 직렬화 가능 

Read Uncommited의 격리 수준이 가장 낮고 Serializable의 격리 수준이 가장 높다. 

출처:https://hello-judy-world.tistory.com/197

 

격리 수준에 따른 문제점

  • Dirty Read
  • Non-Repeatable Read(반복 불가능한 읽기) 
  • Phantom Read

Read Uncommited

커밋되지 않은 데이터를 읽을 수 있다(Dirty Read)

읽은 데이터가 만약 롤백이 된다면? 정합성에 심각한 문제가 발생할 수 있다. 

 

Read committed

커밋한 데이터만 읽을 수 있다.

하지만, 트랜잭션 1에서 데이터를 읽고 작업을 하는 중간에 트랜잭션 2에서 데이터를 수정하고 커밋한다면

트랜잭션 1에서 다시 데이터를 읽었을 때 수정된 데이터가 조회된다. 

이처럼 반복해서 같은 데이터를 읽을 수 없는 상태를 Non-Repeatable Read(반복 불가능한 읽기)라 한다. 

 

Repeatable Read 

한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회된다. 

하지만, 트랜잭션 1이 10살 이하의 회원을 조회했을 때 트랜잭션 2가 5살 회원을 추가하고 커밋하면 

트랜잭션 1이 다시 10살 이하의 회원을 조회했을 때 결과 집합이 달라진다.

이처럼 반복 조회 시 결과 집합이 달라지는 것을 Phantom Read라 한다.

 

Serializable

가정 엄격한 격리 수준으로 위의 문제들이 발생하지 않는다.

다만 동시성 처리 성능이 급격히 떨어질 수 있다. 

 

DB 벤더별로 default isolation level이 다르지만 

mysql, postgreSQL.. READ_COMMITTED 기본 값이라고 한다. 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.