책/real mysql

트랜잭션 격리 수준

ballde 2021. 12. 27. 19:15

이전글에 연장입니다.~

https://balldev.tistory.com/57

 

트랜잭션과 잠금

트랜잭션이란? 트랜잭션은 작업의 완전성을 보장해 주는 것이다. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우 원 상태로 복구해서 작업의 일부만 적용되는 현상

balldev.tistory.com

격리수준이란?

트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것

Isolation level 종류

  1. Read Uncommitted (level 0)
    • SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층
    • 아직 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
    • 일관성을 유지하는 것이 불가능
    Dirty read 발생
  2. Read committed (level 1)
    • 해당 데이터에 Shared Lock이 걸리는 계층
    • 트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 됨
    • Commit 이 이루어진 트랜잭션만 조회 가능
    Non-Repeatable Read 발생
  3. Repeatable read(level 2)
    • SELECT 문장이 사용되는 모든 데이터에 Shared Lock이 걸리는 계층
    • 조회한 데이터 내용이 항상 동일함을 보장
    • 트랜잭션 영역에 해당되는 데이터에 대한 수정 불가능
    Non-Repeatable Read 부정합이 발생하지 않음
  4. Phantom Read 발생
  5. Serializable(level 3)
    • SELECT 문장이 사용되는 모든 데이터에 Shared Lock이 걸리는 계층
    • 완벽한 읽기 일관성 모드를 제공
    • 랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력 불가능

결론: 레벨이 높아질 수록 트랜잭션간 고립 정도가 높아지며, 성능이 떨어지는 것이 일반적이며, 일반적인 온라인 서비스에서는 READ COMMITTED나 REPEATABLE READ 중 하나를 사용한다.

낮은 단계 Isolation Level을 활용할 때 발생하는 현상들

  • Dirty Read
    • 어떤 트랜잭션에서 아직 실행이 끝나지 않은 다른 트랜잭션에 의한 변경사항을 보게되는 경우
    • 커밋되지 않은 수정중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생하는 현상
  • Non-Repeatable Read
    • 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션 값을 수정 또는 삭제하면서 두 쿼리의 결과가 상이하게 나타나는 일관성이 깨진 현상
    • 한 트랜잭션에서 똑같은 SELECT를 수행했을 때 항상 같은 결과를 반환해야 한다는 Repeatable Read 정합성에 어긋남
  • Phantom Read
    • 한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상
    • 트랜잭션 도중 새로운 레코드 삽입을 허용하기 때문에 나타남

repeatable read 격리 수준과 Read committed 격리 수준의 성능 비교

굳이 고른다면 reperatable read

(트랜잭션에서 모든 테이블 데이터를 select 한 후 그대로 놔두면 undo 영역이 계속 커져서)

하지만 의도적인 경우가 아니면 비슷하다!!

주의점

바이너리 로그가 활성화된 mysql서버에서는 read commited 격리 수준을 사용할 수 없다.