7. Dirty reads
Dirty reads란 다른 트랜잭션이 아직 COMMIT하지 않은 변경 내용을 읽으면서 발생하는 읽기 이상 현상
B가 롤백을 수행할 경우, A가 읽은 값은 실제와는 다른 잘못된 값이 될 수 있음
ex)
- 트랜잭션 B가 고객 잔액을 100 → 50으로 변경했지만 아직 COMMIT 안 함
- 트랜잭션 A가 이 50을 읽음
- 이후 B가 ROLLBACK
→ A가 읽은 값은 잘못된 값이 됨
트랜잭션 격리 레벨을 변경 후 테스트
sql
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;Transaction A
- 상품의 개수별 총 금액을 합산 후 조회
- 모든 상품들의 금액을 전체 합산 후 조회
Transaction B
- Product 1(상품 1)의 재고 5개 추가
- 상품의 실제 재고를 확인해보니 재고가 없어서 5개 추가
- 재고를 잘못 확인해서 2번의 작업을 다시 취소(롤백)
| 수행 시점 | 트랜잭션 A | A 결과 | 트랜잭션 B | B 결과 |
|---|---|---|---|---|
| (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