개발자의 길/Database

[MySQL] MySQL 의 Isolation level ( 격리 레벨 )

토아드 2023. 12. 31. 19:57
반응형

여타 RDBMS 와 같이 MySQL 역시 데이터의 정합성을 위해서 데이터를 잠그거나, transaction 단위로 작업을 관리하고, 각 트랜잭션이 수행한 작업들을 별도 로그에 저장해서 언제든 롤백할 수 있도록 관리하고 있다.

 여기서 격리 레벨은 이 데이터 정합성을 지키기 위해 얼마나 엄격히 트랜잭션간의 작업을 격리시키는지를 의미하는데, 다음과 같이 4 단계의 격리 레벨이 있다.

 

  • READ UNCOMMITTED
    • 가장 낮은 격리 수준으로, 다른 트랜잭션에서 커밋되지 않은 변경 내용을 볼 수 있으며, 이로 인해 'Dirty Read'가 발생할 수 있다.
  • READ COMMITTED
    • 커밋된 데이터만 읽을수 있게 되어서 'Dirty Read'는 방지하지만, 'Non-Repeatable Read' 문제는 여전히 발생한다.
  • REPEATABLE READ
    • 트랜잭션이 시작될 때의 데이터 스냅샷을 유지해서, 'Dirty Read'와 'Non-Repeatable Read'를 방지하지만, 'Phantom Read'는 발생할 수 있다.
  • SERIALIZABLE
    • 가장 높은 격리 수준이다. 모든 트랜잭션이 서로 독립적으로 순차실행 되며, 모든 종류의 읽기 문제를 방지하지만 그만큼 동시성이 감소하게 되므로 데이터 정합성이 매우 엄격하지 않는 이상 권장되지 않는다.

 

위에서 몇개 설명하지 않은 내용이 있는데, Dirty Read, Non-Repeartable Read, Pantom Read 다. 모두 정상적이지 않은 읽기 상태를 의미하는데 각각 아래에서 설명하겠다.

 

  • Dirty Read
    • 다른 트랜잭션이 Commit 하지 않은 내용을 읽을 수 있게 되는 현상이다.
  • Non-Repeatable Read
    • 한 트랜잭션 내에서 같은 데이터를 두번 읽을 때, 처음 읽을떄와 다른 트랜잭션에 의해 수정된 두번째 읽는 내용이 다른 현상을 의미한다
    • 예를 들어 트랜잭션 A 가 레코드 1 를 처음 읽고, 트랜잭션 B 가 레코드 1의 값을 바꾼 다음에 트랜잭션 B가 트랜잭션 A 가 종료되기 전에 종료된 경우, 트랜잭션 A 가 한번 더 값을 읽게 되면 트랜잭션 B에 의해 바뀐 값을 보게 되는 문제이다.
  • Pantom Read
    • 위 Non-Repeatable Read 와 비슷한데, Pantom Read 는 새로운 레코드가 추가/삭제 됨으로써 발생하는 문제이다.
      트랜잭션 A가 price column 이 > 100 인 데이터를 읽을때 100개의 record 가 나오고, 트랜잭션 B 가 트랜잭션 A 가 종료되기 전에 price column 이 > 100 인 데이터를 추가하거나 삭제한 경우, 트랜잭션 A 가 한번 더 값을 읽게 되면 이전의 100개의 record 가 아닌 늘어나거나 줄어든 개수의 레코드를 읽게되는 현상이다.
반응형