트랜잭션 격리수준

itonse·2024년 5월 28일
0

CS 스터디

목록 보기
42/56

해당 주제 관련 기술면접 질문 미리보기

Q.트랜잭션 격리수준에 대해서 설명해주세요.


개념

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

격리수준은 크게 아래의 4개로 나뉩니다.

  • Level0. READ UNCOMMITTED
  • Level1. READ COMMITTED
  • Level2. REPEATABLE READ
  • Level3. SERIALIZABLE

아래로 내려갈수록 트랜잭션간 고립 정도가 높아지며, 성능이 떨어지는 것이 일반적입니다.



격리수준 (낮은 순 -> 높은 순)

Level0. READ UNCOMMITTED

  • 다른 트랜잭션에서 커밋되지 않은 내용도 참조할 수 있다. (Dirty Read 발생)
  • 데이터 정합성에 문제가 많으므로, RDBMS 표준에서는 격리 수준으로 인정하지 않는다.

더티 리드(Dirty Read) 란?

한 트랜잭션에서 다른 트랜잭션이 커밋하지 않은 데이터를 읽는 현상을 말합니다.


Level1. READ COMMITTED

  • 어떤 트랜잭션의 변경 내용이 COMMIT 되어야만 다른 트랜잭션에서 조회할 수 있다.
  • Oracle이 기본으로 사용하는 격리수준이다.
  • Non-Repeatable Reads 문제가 발생할 수 있어, 일반적인 웹 어플리케이션에서는 크게 문제되지 않지만, 금전적인 처리와 연결되어있다면 문제가 발생할 수 있다.

논-리피터블 리드(Non-Repeatable Reads) 란?

트랜잭션 내에서 같은 select 에 대해 항상 같은 결과가 나오지 않는 현상을 말합니다.


Level2. REPEATABLE READ

  • 트랜잭션에 진입하기 이전에 커밋된 내용만 참조할 수 있다.
  • MySQL의 InnoDB 스토리지 엔진에서 기본적으로 사용하는 격리수준이다.
  • 팬텀리드가 발생할 수 있지만, MySQL의 InnoDB 에서는 넥스트 키 락 덕분에 이 현상이 거의 발생하지 않는다.

InnoDB 란?

MySQL에서 사용하는 데이터베이스 엔진입니다. 트랜잭션 세이프 스토리지 엔진으로서 대용량 데이터를 처리 할 때 많은 장점을 가지고 있습니다.

팬텀리드(PhantomReads) 란?

한 트랜잭션이 특정 범위의 데이터를 조회할 때, 다른 트랜잭션이 그 범위 상 데이터를 삽입 혹은 삭제하면
두 번째 쿼리에서 결과 집합이 달라질 수 있는 현상을 말합니다.


Level3. SERIALIZABLE

  • 한 트랜잭션에서 읽기, 쓰기 등의 모든 데이터들은 다른 트랜잭션이 접근할 수 없게 한다.
  • 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 하여 성능 매우 떨어진다.(특수한 상황이 아니면 거의 사용하지 않는다)
  • 모든 동작이 직렬화하게 작동하여 완벽한 읽기 일관성 모드를 제공한다.



요약

Dirty ReadNon-Repeatable ReadPhantom Read
READ UNCOMMITTED발생발생발생
READ COMMITTED없음발생발생
REPEATABLE READ없음없음발생 (MySQL은 거의 없음)
SERIALIZABLE없음없음없음

참고) ISOLATION LEVEL 조회 방법

SHOW VARIABLES like 'tx_isolation';



트랜잭션 격리수준 관련 기술면접 질문

Q.트랜잭션 격리수준에 대해서 설명해주세요.

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

격리 수준은 크게 네 가지가 있습니다.

첫째, READ UNCOMMITTED입니다. 이 수준에서는 커밋되지 않은 데이터도 읽을 수 있어서 Dirty Read, Non-Repeatable Read, Phantom Read가 발생할 수 있습니다.

둘째, READ COMMITTED입니다. 커밋된 데이터만 읽을 수 있어서 Dirty Read는 방지되지만, Non-Repeatable Read와 Phantom Read는 여전히 발생합니다.

셋째, REPEATABLE READ입니다. 이 수준에서는 트랜잭션 내에서 동일한 데이터를 읽을 수 있어서 Non-Repeatable Read를 방지합니다. 그러나 Phantom Read는 발생할 수 있습니다. MySQL의 기본 격리 수준입니다.

마지막으로, SERIALIZABLE입니다. 모든 트랜잭션을 직렬적으로 처리해서 모든 읽기 문제를 방지합니다. 하지만 동시성이 줄어들어 성능 저하가 있을 수 있습니다.



ref.
트랜잭션의 격리수준(Isolation level)이란?
https://github.com/ksundong/backend-interview-question
https://mangkyu.tistory.com/299
[db] 트랜잭션 격리 수준(isolation level)
https://neocan.tistory.com/396
https://velog.io/@shins/더티리드와-논-리피터블-리드-그리고-팬텀리드-MySQL-을-중심으로

0개의 댓글