Skip to Content
Suffering builds character

7. Dirty reads

Dirty reads란 다른 트랜잭션이 아직 COMMIT하지 않은 변경 내용을 읽으면서 발생하는 읽기 이상 현상

B가 롤백을 수행할 경우, A가 읽은 값은 실제와는 다른 잘못된 값이 될 수 있음

ex)

  1. 트랜잭션 B가 고객 잔액을 100 → 50으로 변경했지만 아직 COMMIT 안 함
  2. 트랜잭션 A가 이 50을 읽음
  3. 이후 B가 ROLLBACK
    → A가 읽은 값은 잘못된 값이 됨

트랜잭션 격리 레벨을 변경 후 테스트

sql
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

Transaction A

  1. 상품의 개수별 총 금액을 합산 후 조회
  2. 모든 상품들의 금액을 전체 합산 후 조회

Transaction B

  1. Product 1(상품 1)의 재고 5개 추가
  2. 상품의 실제 재고를 확인해보니 재고가 없어서 5개 추가
  3. 재고를 잘못 확인해서 2번의 작업을 다시 취소(롤백)
수행 시점트랜잭션 AA 결과트랜잭션 BB 결과
(1) BEGIN; (2) BEGIN; 
(3) SELECT PRODUCT_ID, QUANTITY * PRICE FROM SALES;   
 PRODUCT 1(50), PRODUCT 2(80)  
트랜잭션 A가 아직 COMMIT되지 않은 상태  (4) UPDATE SALES SET QUANTITY = QUANTITY + 5 WHERE PRODUCT_ID = 1;업데이트 성공
(5) SELECT SUM(QUANTITY * PRICE) FROM SALES;155  
COMMIT; ROLLBACK; 

해결 방법

격리 레벨을 READ COMMITTED로 격상하기

트랜잭션 격리 레벨을 READ COMMITTED로 격상 후 다시 테스트해보기

sql
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
Last updated on