-
트랜잭션 격리 수준CS/DataBase 2025. 2. 23. 01:31
트랜잭션 격리 수준에 따라 발생되는 문제
Dirty Read
다른 트랜잭션에 의해 수정되었지만, 아직 커밋되지 않은 상태의 데이터를 읽는 것을 말합니다.
1. 1번 트랜잭션 시작
2. 1번 트랜잭션이 데이터 삽입
3. 2번 트랜잭션 시작
4. 2번 트랜잭션이 데이터 조회 => 1번 트랜잭션이 추가한 데이터가 읽힘
5. 1번 트랜잭션 ROLLBACK => 데이터 불일치
Non-Repeatable Read
하나의 트랜잭션 안에서 반복읽기가 불가능한 현상입니다.
1. 1번 트랜잭션 시작
2. 1번 트랜잭션이 데이터 조회 -> 2개의 행 반환
SELECT * FROM name WHERE idx<4;idx nickname 1 sunnuy 2 stella 3. 2번 트랜잭션 시작
4. 2번 트랜잭션이 데이터 편집
UPDATE name SET nickname="flower" WHERE idx=2;5. 2번 트랜잭션 커밋
6. 1번 트랜잭션이 데이터 조회 -> 2번과 다른 조회 결과
idx nickname 1 sunny 2 flower 7. 1번 트랜잭션 커밋
Phantom Read
유령읽기란, 하나의 트랜잭션에서 여러 번 조회할 때, 없던 데이터가 읽히는 현상입니다.
1. 1번 트랜잭션 시작
2. 1번 트랜잭션이 데이터 조회 -> 2개의 행 반환
SELECT * FROM name WHERE idx<4;idx nickname 1 sunnuy 2 stella 3. 2번 트랜잭션 시작
4. 2번 트랜잭션이 데이터 삽입
INSERT INTO name(idx, name) VALUE (3, "moon")5. 2번 트랜잭션 커밋
6. 1번 트랜잭션이 데이터 조회 -> 3개의 행 반환 -> Phantom Read
SELECT * FROM name WHERE idx<4;idx nickname 1 sunny 2 stella 3 moon 7. 1번 트랜잭션 커밋
트랜잭션 격리 수준
Read Uncommited
말 그대로 commit되지 않은 데이터도 읽을 수 있는 격리 수준입니다.
정합성에 문제가 많은 격리 수준이기 때문에 사용하지 않는 것이 권장됩니다.
Dirty Read, Non-Repeatable Read, Phantom Read 문제가 모두 발생할 가능성이 있습니다.
Read Commited
commit된 데이터만 읽을 수 있는 격리 수준입니다.
RDB에서 대부분 기본적으로 사용되고 있는 격리 수준입니다. (Oracle)
이 경우 Dirty Read는 발생하지 않지만, 여전히 Non-Repeatable Read, Phantom Read 문제가 발생할 가능성이 있습니다.
Repeatable Read
자신의 트랜잭션이 생성되기 이전의 트랜잭션에서 COMMIT 이 된 데이터만 읽습니다.
MySQL과 MariaDB 가 기본으로 사용하는 격리 수준입니다.
MySQL에서는 UNDO 테이블에 변경 이전의 데이터를 저장하고, 트랜잭션이 끝나기 전에 해당 데이터에 변경 사항이 생기면 실제 테이블이 아닌 UNDO 테이블에서 데이터를 읽어옵니다.
이렇게 변경 이전 버전의 데이터를 저장해놓는 방식을 MVVC라고 하는데요, MVVC 덕분에 Dirty Read, Non-Repeatable Read는 발생하지 않지만, MVVC방식은 INSERT는 보장하지 않기 때문에 Phantom Read는 발생할 가능성이 있습니다.
하지만 MySQL의 경우 갭락과 넥스트 키 락이란 것을 사용해 팬텀리드를 방지합니다.
조회하는 데이터 범위 전체를 락을 걸어 데이터가 삽입되지 못하게 하는 방식입니다.
'CS > DataBase' 카테고리의 다른 글
vectorDB와 GraphDB (0) 2025.09.16 CTAS란? (1) 2025.03.28 SQL의 윈도우 함수 (with PARTITION BY) (2) 2025.02.17 CTE(Common Table Expression) (2) 2025.02.17 [DataBase] 트랜젝션 (2) 2024.12.02