데이터베이스

트랜잭션 격리 수준

iksadnorth 2023. 7. 24. 01:26

👣 개요

ACID 원칙 중 Isolation 원칙을 지키기 위해선 트랜잭션 연산 결과가 다른 트랜잭션에 영향을 끼치지 않아야 한다.
이를 완벽하게 지키기 위해선 모든 트랜잭션 연산을 직렬적으로 수행되면 된다.
하지만 이 경우, 성능이 너무 떨어지기 때문에 어느 정도 타협해 병렬적으로 수행하게 할 수 있다.

'트랜잭션 수준'의 정확한 정의는
'특정 트랜잭션이 변경하거나 조회하고 있는 데이터에 대해서 다른 트랜잭션에 대한 조회 허용 수준'
라고 할 수 있다.

👣 Read_Uncommitted

격리 수준

가장 낮은 격리 수준으로 트랜잭션이 커밋되지 않아도 다른 트랜잭션에 노출되는 수준이다.

발생 문제 - Dirty Read, Non-Repeatable Read, Phantom Read

👣 Read_Committed

격리 수준

가장 많이 사용되는 격리 수준으로 
가져오고자 하는 데이터가 쿼리 시작 전에 변경되었다면
실제 버퍼 캐시, DB에 저장된 값을 가져오는 것이 아닌 
UNDO 영역에 변경 전 데이터를 가져온다.

발생 문제 - Non-Repeatable Read, Phantom Read

👣 Repeatable_Read

격리 수준

MySQL의 InnoDB에서 사용하는 격리 수준으로
트랜잭션이 다른 트랜잭션이 특정 Row를 수정할 수 없도록 막지만
새로운 Row 생성하는 것을 막지 않는 수준.

트랜잭션마다 트랜잭션 ID를 부여하는데 해당 격리 수준을 사용하면
자신의 ID보다 작은 번호를 받은 트랜잭션에 대해서만 읽게 된다.
쉽게 말해서 자신의 트랜잭션이 시작되기 전의 커밋된 내용에 대해서만 조회 할 수 있는 것이다.

발생 문제 - Phantom Read

👣 Serializable

격리 수준

모든 트랜잭션을 순차적으로 직렬로 실행시키는 방법.
격리성에 대해선 걱정할 것이 없지만 교착 상태가 많이 일어나고 가장 성능이 좋지 못함.

발생 문제 - X But 너무 낮은 성능.

👣 Dirty Read

다른 트랜잭션에서 커밋하지 않아도 해당 트랜잭션의 값이 반영되는 문제.

👣 Non-Repeatable Read

UNDO 영역에서 읽어오기 때문에 커밋되기 전까지는 '트랜잭션 B' 내용이 반영되지 않지만
'트랜잭션 A'가 끝나기도 전에 '트랜잭션 B'가 커밋이 되버리면 커밋 내용이 반영되어
트랜잭션 중에 값이 바뀌어져 버린다.

👣 Phantom Read 

트랜잭션 내부에서 범위 탐색 쿼리를 두 번 실행할 때
첫 번째 실행 시에 없던
(phantom) 레코드 가 조회되는 현상

'데이터베이스' 카테고리의 다른 글

인덱스  (0) 2023.07.24
데이터베이스 종류  (0) 2023.07.24
트랜잭션  (0) 2023.07.23
정규화 과정  (0) 2023.07.23
데이터 베이스 용어 정리  (0) 2023.07.23