본문으로 바로가기

5.4 MySQL의 격리 수준

category Book & Lecture/Real MySQL 8.0 2021. 12. 1. 23:12

해당 글은 Real MySQL 8.0 책을 보고 요약한 내용입니다.


5.4 MySQL의 격리 수준

트랜잭션의 격리 수준이란? 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것.

격리 수준이 높아질수록 격리 정도가 높아지며, 동시 처리 성능이 떨어짐.

-> SERIALZABLE 격리 숮준이 아니라면 크게 성능의 개선이나 저하가 발생하지 않음.

격리 수준

  • READ UNCOMMITTED
    • DIRTY READ, NON-REPEATABLE READ, PHANTOM READ
  • READ COMMITTED
    • NON_REPEATABLE READ, PHANTOM READ
  • REPEATABLE READ
    • PHANTOM READ(InnoDB는 X)
  • SERIALIZABLE

부정합

  • DIRTY READ
  • NON_REPEATABLE READ
  • PHANTOM READ

5.4.1 READ UNCOMMITTED

COMMIT이나 ROLLBACK 여부에 상관없이 다른 트랜잭션에서 보임.

예시

  • A, B 트랜잭션이 존재한다고 했을때
    • A 트랜잭션이 0n1dev, 5000 이라는 값을 삽입 (아직 COMMIT 안함)
    • B 트랜잭션이 5000을 조회하면 0n1dev, 5000이 조회 됨
    • A 트랜잭션 COMMIT

이때, B 트랜잭션이 조회 후 A 트랜잭션에서 예외가 발생 했을때 ROLLBACK이 되어도 B 트랜잭션에서 0n1dev, 5000이 정상적인 데이터라고 판단.

-> 어떤 트랜잭션에서 처리한 작업이 완료되지 않았는데 다른 트랜잭션에서 볼 수 있는 현상을 더티 리드라 함.

5.4.2 READ COMMITTED

오라클 DBMS에서 기본으로 사용되는 격리 수준.

더티 리드는 발생하지 않음.

COMMIT이 완료된 데이터만 다른 트랜잭션에서 조회 가능.

예시

  • A, B 트랜잭션이 존재한다고 했을때
    • A 트랜잭션이 0n1dev, 5000 이라는 값을 0n1dev, 7000으로 업데이트 (아직 COMMIT 안함)
    • B 트랜잭션이 0n1dev를 조회하면 0n1dev, 5000이 조회 됨
      • 변경 된 값은 테이블에 기록되고, 이전 값은 언두 영역으로 백업 됨
    • A 트랜잭션 COMMIT

-> NON-REPEATABLE READ가 발생 함. 하나의 트랜잭션 내에서 동일한 SELECT 쿼리를 실행하면 항상 같은 결과를 가져와야 함. (정합성에 어긋남)

5.4.3 REPEATABLE READ

MySQL의 InnoDB 스토리지 엔진에서 기본으로 사용되는 격리 수준.

더티 리드와 NON-REPEATABLE READ가 발생하지 않음.

READ COMMITTED와 동일하게 MVCC를 이용해 COMMIT 전 데이터를 보여줌. (언두 영역에 백업된 레코드의 여러 버전 중 몇 번째 이전 버전까지 찾아 들어가야 하느냐가 다름.)

예시

  • A, B 트랜잭션이 존재한다고 했을때
    • B 트랜잭션이 0n1dev, 5000 조회
    • A 트랜잭션이 0n1dev, 5000을 0n1dev, 7000으로 업데이트
      • 언두 로그에 변경 전 데이터 0n1dev, 5000이 남아 있음.
    • A 트랜잭션 COMMIT
    • B 트랜잭션 0n1dev 조회
      • 언두 로그를 통해서 0n1dev, 5000을 조회

-> PHANTOM READ가 발생.

5.4.4 SERIALIZABLE

가장 단순한 격리 수준이면서 동시에 가장 엄격한 격리 수준.

동시 처리 성능이 다른 트랜잭션의 격리 수준보다 떨어짐.

InnoDB 스토리지 엔진에서는 갭 락과 넥스트 키 락 덕분에 REPEATABLE READ 격리 수준에서도 PHANTOM READ가 발생하지 않음.

'Book & Lecture > Real MySQL 8.0' 카테고리의 다른 글

6.0 데이터 압축  (0) 2021.12.08
5.3 InnoDB 스토리지 엔진 잠금  (0) 2021.11.28
5.2 MySQL 엔진의 잠금  (0) 2021.11.24
5.1 트랜잭션  (0) 2021.11.22
5. 트랜잭션과 잠금  (0) 2021.11.22