반응형
트랜잭션 격리 수준 중 가장 혼동되는 두 단계가 바로 READ UNCOMMITTED와 READ COMMITTED다.
둘 다 빠른 성능을 제공하지만, 정합성 보장 수준에서는 큰 차이가 있다.

🔎 READ UNCOMMITTED란?
- 커밋되지 않은 데이터도 읽을 수 있음
- 가장 낮은 격리 수준
- 성능은 빠르지만 데이터 무결성은 보장되지 않음
- Dirty Read가 발생할 수 있음
🧪 실습 예제: Dirty Read 발생
-- 세션 A
START TRANSACTION;
UPDATE users SET credit = credit - 500 WHERE id = 1;
-- 세션 B (READ UNCOMMITTED)
SELECT credit FROM users WHERE id = 1; -- 수정된 값이 조회됨 (커밋 전)
-- 세션 A
ROLLBACK;
세션 B는 존재하지 않을 값을 읽은 셈이다.
A가 롤백하면 결국 B는 잘못된 데이터를 참조한 상태가 된다.
반응형
🔎 READ COMMITTED란?
- 커밋된 데이터만 읽을 수 있음
- Dirty Read는 방지됨
- 하지만 같은 쿼리를 반복하면 결과가 달라질 수 있음
- 즉, Non-repeatable Read는 발생 가능
🧪 실습 예제: 반복 조회 시 값이 달라짐
-- 세션 A
START TRANSACTION;
SELECT price FROM product WHERE id = 100; -- 1000원
-- 세션 B
UPDATE product SET price = 1200 WHERE id = 100;
COMMIT;
-- 세션 A
SELECT price FROM product WHERE id = 100; -- 1200원
같은 쿼리라도 결과가 바뀌는 이유는
세션 A가 조회하는 중간에 세션 B가 COMMIT을 완료했기 때문이다.
✅ 두 격리 수준 비교 요약
| 항목 | READ UNCOMMITTED | READ COMMITTED |
| Dirty Read | 발생함 | 발생하지 않음 |
| Non-repeatable Read | 발생함 | 발생함 |
| 데이터 정합성 | 매우 낮음 | 보통 수준 |
| 성능 | 매우 빠름 | 빠름 |
💡 실무에서는 어떤 걸 써야 할까?
- READ UNCOMMITTED는 거의 사용하지 않음
→ 로그 분석, 통계 추출 등 정합성이 중요하지 않은 비즈니스에만 제한적 사용 - READ COMMITTED는 실무에서 가장 보편적으로 사용됨
→ 오라클, PostgreSQL의 기본값도 READ COMMITTED
→ Dirty Read를 막을 수 있으면서 성능도 나쁘지 않다 - MySQL에서는 기본값이 REPEATABLE READ지만
경우에 따라 READ COMMITTED로 조정하는 것이 더 나을 수 있다
📘 공식 문서 참고
https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html
반응형
'DB' 카테고리의 다른 글
| [MySQL] (보안설정1️⃣) 데이터 암호화가 필요한 이유와 기본 개념 정리 (1) | 2025.07.16 |
|---|---|
| [MySQL] (트랜잭션 격리수준5️⃣) 실무에서 격리 수준 설정은 이렇게 한다 (1) | 2025.07.16 |
| [MySQL] (트랜잭션 격리수준4️⃣) 격리 수준별 현상 실습: Dirty ~ Phantom Read (0) | 2025.07.16 |
| [MySQL] (트랜잭션 격리수준3️⃣) REPEATABLE READ vs SERIALIZABLE 차이 완전분석 (0) | 2025.07.16 |
| [MySQL] (트랜잭션 격리수준1️⃣) 격리 수준이란? 4단계 개념 정복 (0) | 2025.07.15 |
| [MySQL] (환경설정6️⃣) 자주 실수하는 my.cnf 설정 오류 사례 (0) | 2025.07.15 |
| [MySQL] (환경설정5️⃣) my.cnf 실전 튜닝: 운영환경별 추천값 정리 (0) | 2025.07.15 |
| [MySQL] (환경설정4️⃣) query_cache는 아직 유효한가? 설정 전략 분석 (0) | 2025.07.15 |