[MySQL] mysql 격리 수준 알아보기

2023-08-05


사진: Unsplash 의 Sergey Kotenev


1. 정의

 

-- 격리수준 조회
SELECT @@tx_isolation;
-- 격리수준 설정
SET TRANSACTION ISOLATION LEVEL <격리수준>;

 

* READ UNCOMMITTED (커밋되지 않은 읽기)


가장 낮은 격리 수준으로 하나의 트랜잭션에서 변경한 데이터가 커밋되지 않았더라도 다른 트랜잭션에서 읽을 수 있습니다. 이로 인해 '더티 리드(Dirty Read)'와 같은 현상이 발생할 수 있으며, 다른 트랜잭션이 롤백될 경우 읽은 데이터도 롤백될 수 있습니다. 이 격리 수준은 데이터의 일관성과 고립성을 보장하지 않습니다.



* READ COMMITTED (커밋된 읽기)


이 격리 수준에서는 커밋된 데이터만 다른 트랜잭션에서 읽을 수 있습니다. 따라서 '더티 리드(Dirty Read)'는 발생하지 않지만, 'Non-Repeatable Read(반복 불가능한 읽기)' 문제가 발생할 수 있습니다. 다른 트랜잭션이 커밋될 때까지 데이터가 변경되는 것을 막는 것이 아니기 때문입니다.



* REPEATABLE READ (반복 가능한 읽기)


이 격리 수준에서는 한 트랜잭션 내에서 같은 쿼리를 여러 번 실행하더라도 결과가 일관되게 유지됩니다. 다른 트랜잭션이 데이터를 수정하더라도 해당 트랜잭션이 커밋되지 않는 한, 해당 트랜잭션에서 읽은 데이터는 변하지 않습니다. 하지만 '팬텀 리드(Phantom Read)'라고 하는 현상은 여전히 발생할 수 있습니다. 이는 다른 트랜잭션이 데이터를 추가하거나 삭제할 때 발생합니다.



* SERIALIZABLE (직렬화 가능한)


가장 높은 격리 수준으로, 동시에 여러 트랜잭션을 실행할 때 데이터베이스 시스템은 마치 순차적으로 실행되는 것처럼 처리합니다. 이로 인해 '더티 리드(Dirty Read)', 'Non-Repeatable Read(반복 불가능한 읽기)', '팬텀 리드(Phantom Read)' 등의 현상을 모두 방지합니다. 하지만 동시성 처리 성능이 감소할 수 있습니다.


2. 기타 용어

 

* 더티 리드(Dirty Read)

 

데이터베이스 트랜잭션에서 다른 트랜잭션이 변경 중인(아직 커밋되지 않은) 데이터를 읽는 현상을 말합니다. 이것은 격리 수준이 낮은 상황에서 발생할 수 있는 문제입니다.


* Non-Repeatable Read(반복 불가능한 읽기)

 

데이터베이스 트랜잭션에서 같은 쿼리를 여러 번 실행할 때, 결과가 일관되지 않는 현상을 말합니다. 다른 트랜잭션이나 작업에서 데이터를 변경하면서 특정 트랜잭션이 같은 데이터를 조회할 때, 결과가 변경되는 것을 의미합니다.


* 팬텀 리드(Phantom Read)

 

반복 가능한 읽기에서는 데이터를 조회할 때, 특정 범위의 레코드를 읽은 후에 다른 트랜잭션이 새로운 레코드를 추가하거나 삭제하면서 데이터 집합이 변경되는 "팬텀 리드" 문제가 발생할 수 있습니다. 이는 조회된 범위 내에서 레코드의 추가 또는 삭제가 허용되기 때문입니다.


메인 이미지 출처 : 사진: UnsplashSergey Kotenev