본문 바로가기

Back-End 공부/Database

[Database] DB 동시성 이슈(Dirty Read, Non-Repeatable Read, Phantom Read)

📌  DB 동시성 이슈

트랜잭션이 동시에 실행됐을때 발생할 수 있는 문제 관련한 상황

= Read Phenomena (읽기 이상현상)

 

💡 dirty read

  • 동시에 진행되고 있는 다른 트랜잭션(아직 커밋하지 않은 상태)에서 변경한 데이터를 현재 진행 중인 트랜잭션에서 읽어 들이는 것을 뜻합니다.
  • 아직 commit되지 않은 데이터가 읽힘으로서, 추후 rollback 될 가능성이 있는 데이터 read
  • 해결책 : Read Committed 격리성

 

💡  Non-Repeatable Read

  • 하나의 트랜잭션 중 읽어 들였던 특정 row의 값을 같은 트랜잭션 내에서 다시 읽어 들이는데 중간에 변경사항이 생겨 (실제로 COMMIT이 된 변경사항) 결괏값이 다르게 나오는 현상을 뜻합니다.
  • mariaDB의 기본 설정은 Repeatable Read
  • 한 트랜잭션에서 동일한 조회 쿼리를 두 번 이상 실행할때에, 그 중간에 다른 트랜잭션에서 데이터를 수정하여 한 트랜잭션의 결과가 다르게 나타나는 문제 예시) 재고 업데이트 전 현재 재고 조회 -> 수량업데이트 -> 변경된 재고 수량을 다시 조회(한트랜잭션에서). 그러나 만일 이를 중간에 누가 수정을 가하면 재조회시 오차 발생하여 에러.
  • 해결책 : Repeatable Read 격리성 -> 한 트랜잭션이 조회하는 동안 다른 트랜잭션이 update를 하더라도 현재 트랜잭션의 read값이 변경되지 않도록 하는 격리성. 그러나, 만약 다른 트랜잭션에서 update를 통해 값을 변경해버렸다면, read한 값 자체에 문제 발생. => 비관적인 Lock(공유락, 배타락) 사용

 

💡   Phantom Read

  • 트랜잭션 시작 시점 데이터를 읽었을 때 존재하지 않았던 데이터가 다시 같은 조건으로 데이터를 읽어 들였을 때 존재해 (유령처럼) INCONSISTENT 한 결괏값을 반환하는 현상을 뜻합니다.
  • 한 트랜잭션이 같은 조회쿼리를 여러 번 실행했을 때, 그 중간에 다른 트랜잭션에서 새로운 데이터를 추가/삭제하여 다르게 나타나는 문제
  • 해결책 : Repeatable Read 격리성. 팬텀(유령) 읽기 또한 repeatable Read격리성으로 해결이 가능하나, 이 부분은 DB마다 차이가 있어 phantom read를 해결하기 위해 Serializable 격리수준이 필요할수도 있음. 다만, DB에서 주로 발생하는 문제는 동시에 수정하는 상황이므로, 수정에 초점을 두고 해결 전략을 살펴봐도 좋을것.

 

💡   Lost Updates

  • 한 트랜잭션에서 데이터를 변경한 뒤 아직 커밋을 하지 않은 상태에서 읽어 들일 때, 다른 트랜잭션으로 인해 내가 작성한 변경사항이 덮어씌워지는 현상을 뜻합니다.

 

 

📌  DB 동시성 이슈로 인한 읽기 이상현상 해결 방법

https://rookie-programmer.tistory.com/149

 

[Database] 트랜잭션 격리 수준(isolation level) 문제점과 해결방법

📌 격리수준 Read Phenomena를 해결할 수 있는 여러가지 방법 LV1: Read-Uncommitted 아직 커밋되지 않은 트랜잭션에서 처리중인 데이터를 다른 트랜잭션에서 읽는 것을 허용하는 격리 레벨 정합성에 문

rookie-programmer.tistory.com

 

 

 

 

- Reference

https://amazelimi.tistory.com/entry/MySQL-Transaction%EC%9D%98-%EB%AA%A8%EB%93%A0-%EA%B2%83

 

[MySQL] Transaction의 모든 것 | LIM

MySQL/MariaDB의 InnoDB 스토리지 엔진은 Transaction(트랜잭션) 기능을 지원한다. 📌 Transaction 단어의 뜻은 이러하다. 거래, 매매 처리과정 컴퓨터 과학 분야에서의 트랜잭션은 “더이상 분할이 불가능

amazelimi.tistory.com