DB

트랜잭션 격리 수준

우디혜 2021. 11. 30. 00:53

종류는 잘 알려진대로 아래 4가지. 

 

1.  READ UNCOMMITTED 

  • SELECT 조회 시, 공유락 X
  • 커밋되지 않은 데이터를 읽을 수 있다
  • 🚨 Dirty Read : 커밋되지 않은 (변경 중인) 데이터를 읽어, 데이터의 무결성이 깨질 수도 있는 현상       
    • A 트랜잭션이 B 트랜잭션이 건드리고 있는 데이터를 읽고
    • 이를 바탕으로 로직을 수행하고 A 트랜잭션은 커밋함
    • B 트랜잭션이 갑자기 롤백되버림
    • A 트랜잭션 당황.. 난 이미 커밋해버렸는데..? (무결성 와장창)

 

2.  READ COMMITTED

  • SELECT 조회 시, 데이터에 공유락 O
  • 커밋된 데이터만 읽을 수 있다
  • 해당 데이터가 사용되고 있을 때만 공유락이 걸린다
    • SELECT 대상이 되는 데이터 row1, row2가 있을 때
    • row1을 읽는 순간에는 row1에만 공유락이 걸린다 (다른데서 쓰기 불가능)
    • row2를 읽을 차례가 되면 row1의 공유락이 풀려 다른데서 쓰기작업이 가능해진다
  • 🚨 Non-repeatable read : 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 같은 레코드에 대해 다른 결과 값을 읽는다
    • A 트랜잭션 : row1 읽음
    • B 트랜잭션 : A가 다 읽고난 뒤 row1 수정하고 커밋
    • A 트랜잭션 : row1 다시 읽는데 처음 읽었을 때랑 다름 (A 트랜잭션 당황)

 

3.  REPEATABLE READ

  • SELECT 조회 시, 데이터에 공유락 O
  • 트랜잭션이 수행되는 동안에는 조회하는 데이터의 내용이 항상 동일하다는 것을 보장해준다
  • SELECT에서 건드리는 모든 데이터에 공유락이 걸린다
    • SELECT 대상이 되는 데이터 row1, row2가 있을 때 둘 다 공유락이 걸린다
    • 해당 트랜잭션이 데이터를 다 읽을 때까지 다른 트랜잭션은 해당 데이터 못건드림
  • 🚨 Phantom read : 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 이전에 없던 레코드가 읽히는 것 
    • A 트랜잭션 : table 1 읽음 (총 10개)
    • B 트랜잭션 : table 1에 레코드 추가
    • A 트랜잭션 : table 1 읽음 (총 11개) ...? (A 트랜잭션 당황.. 없던게 생겼네 귀신인가)

 

4.  SERIALIZABLE

  • SELECT 조회 시, 관련 테이블에 공유락 O
  • 트랜잭션이 수행되는 동안 완벽하게 일관적인 조회를 보장
  • 대신 성능 문제 발생

 

아래로 내려갈수록,

  • 격리수준, 고립성, 무결성 UP
  • 동시성, 성능 DOWN

 

Reference 

https://stackoverflow.com/a/16162426

https://hleee.medium.com/%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-3287d4bcc64d

https://dar0m.tistory.com/225