DB

[MySQL] (트랜잭션 격리수준2️⃣) READ UNCOMMITTED vs READ COMMITTED

인생아 2025. 7. 15. 17:06
반응형

트랜잭션 격리 수준 중 가장 혼동되는 두 단계가 바로 READ UNCOMMITTEDREAD 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

 

반응형