[MySQL] 격리 수준 (Transaction Isolation Level)

hwwwa·2023년 1월 19일
0

MySQL Transaction Isolation Level

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

  • READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE의 4가지 단계

  • transaction-isolation 옵션을 통해 격리 수준 지정 가능

  • 격리 수준 레벨에 따른 부정합 문제 발생 여부

    DIRTY READNON-REPEATABLE READPHANTOM READ
    READ UNCOMMITTED발생발생발생
    READ COMMITTED없음발생발생
    REPEATABLE READ없음없음발생 (InnoDB는 없음)
    SERIALIZABLE없음없음없음

READ UNCOMMITTED

  • DIRTY READ 발생
    • 어떤 세션에서 진행중인 트랜잭션이 처리 완료되지 않은 상태라도 다른 세션에서 변경된 정보를 볼 수 있음
  • 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부와 상관없이 다른 트랜잭션에서 보여짐
  • 데이터가 보였다가 사라졌다 하는 현상 발생
  • DBMS 표준에서 트랜잭션의 격리 수준으로 인정하지 않을 정도로 데이터 정합성에 큰 문제 발생 가능
  • 일반적인 데이터베이스에서 거의 사용하지 않음

READ COMMITTED

  • Oracle에서 기본으로 사용되는 격리 수준
  • 온라인 서비스에서 가장 많이 사용
  • 트랜잭션에서 데이터 변경 시 COMMIT 수행 후에만 다른 세션에서 변경된 데이터 조회 가능
  • MVCC : 하나의 데이터에 대해 여러 버전이 존재하고 조회할 수 있는 기능
    • 트랜잭션이 COMMIT을 하기 전에 다른 세션에서 해당 데이터 조회 시 UNDO를 참조하여 이전 값을 보여줌
  • NON-REPEATABLE READ 부정합 문제 존재
    • SELECT 쿼리가 실행될 때마다 다른 결과가 발생할 수 있음

REPEATABLE READ

  • MySQL의 InnoDB 스토리지 엔진에서 기본적으로 사용되는 격리 수준
  • MVCC를 이용해 COMMIT 되기 전 데이터를 보여줌
    • InnoDB 스토리지 엔진은 트랜잭션이 Rollback 될 경우를 대비하여 변경 전 데이터를 UNDO에 백업해두고 실제 레코드 값을 변경
  • UNDO 영역에 백업된 레코드의 여러 버전 중 몇 번째 이전 버전까지 찾아 들어갈 수 있는지가 READ COMMITTED과의 차이점
  • REPEATABLE READ 레벨에서 MVCC를 보장하기 위해 실행중인 트랜잭션 중 가장 오래된 트랜잭션 번호보다 앞선 UNDO 영역의 데이터는 삭제 불가
    • 특정 트랜잭션 번호 구간 내에서 백업된 UNDO 데이터가 보존되어야 함
  • 장기간 활성화 되어 있는 트랜잭션으로 인해 UNDO 영역이 백업된 데이터로 인해 무한정 커질 수 있음
    • MySQL 서버 처리 성능 저하의 원인

SERIALIZABLE

  • 가장 단순한 격리 수준이면서 가장 엄격한 격리 수준
  • 읽기 작업도 공유 잠금(읽기 잠금)을 획득 해야만 하며, 동시에 다른 트랜잭션에서 접근 불가
  • PHANTOM READ 부정합이 발생하지 않음
  • 동시성이 중요한 데이터베이스에서는 거의 사용하지 않음
  • InnoDB 스토리지 엔진에서는 REPEATABLE READ 사용 시 갭 락과 넥스트 키 락 덕분에 PHANTOM READ가 발생하지 않으므로 굳이 SERIALIZABLE을 사용할 필요는 없음

0개의 댓글