Skip to content

Commit 1a1cfa0

Browse files
committed
Update DB Post " [DB] 트랜잭션 격리 수준 "
1 parent 585ff86 commit 1a1cfa0

File tree

1 file changed

+3
-9
lines changed

1 file changed

+3
-9
lines changed

_posts/2023-02-20-DB-Transaction-Isolation-Level.md

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,7 @@ author: devFancy
179179

180180
* T6 ~ T7: 트랜잭션 B는 10,000원을 기준으로 3,000원 결제를 처리한 후, `UPDATE ... WHERE balance = 10000` 쿼리를 실행한다. 하지만 T4 시점에 A가 커밋한 DB의 실제 잔액은 5,000원이므로 `WHERE` 조건이 불일치하여 **최종 업데이트는 실패**한다.
181181

182-
이처럼 `REPEATABLE READ`**'트랜잭션 내의 일관성'** 을 위해 **'데이터의 최신성'** 을 희생하는 전략을 사용한다.
183-
184-
이 특징을 이해해야 동시성 이슈가 발생했을 때 정확한 원인을 파악하고 `READ COMMITTED`와 같은 다른 격리 수준을 대안으로 고려할 수 있다.
185-
186-
이처럼 `REPEATABLE READ`는 트랜잭션의 일관성을 보장하기 위해 **자신이 시작된 이후에 커밋된 변경 사항은 반영하지 않는다.**
187-
188-
이 특징을 이해해야 동시성 이슈가 발생했을 때 정확한 원인을 파악하고 `READ COMMITTED`와 같은 다른 격리 수준을 대안으로 고려할 수 있다.
182+
이처럼 `REPEATABLE READ`**'트랜잭션 내의 일관성'** 을 위해 **'데이터 정합성'** 을 일부 희생하는 전략을 사용한다. 이 특징을 이해해야 동시성 이슈가 발생했을 때 정확한 원인을 파악하고 `READ COMMITTED`와 같은 다른 격리 수준을 대안으로 고려할 수 있다.
189183

190184
### SERIALIZABLE
191185

@@ -211,9 +205,9 @@ author: devFancy
211205
반면, `REPEATABLE READ` 환경에서는 사용자의 결제 트랜잭션이 시작될 때 상품 가격(1,000원)이 스냅샷으로 저장된다. 중간에 가격이 1,500원으로 변경되더라도 사용자의 트랜잭션 내에서는 일관되게 1,000원으로 처리되어 예측 가능한 경험을 제공한다.
212206

213207
결국 정답은 없다.
214-
격리 수준의 선택은 '데이터의 최신성'과 **'트랜잭션 내의 일관성(논리적 정합성)'** 사이의 트레이드오프이다.
208+
격리 수준의 선택은 '데이터의 정합성'과 **'트랜잭션 내의 일관성(논리적 정합성)'** 사이의 트레이드오프이다.
215209

216-
- `READ COMMITTED`: 다른 트랜잭션의 변경 사항을 빠르게 반영해야 하는 금융 정보 조회 등 **데이터 최신성**이 중요할 때 유리하다. (ex: 계좌 잔액)
210+
- `READ COMMITTED`: 다른 트랜잭션의 변경 사항을 빠르게 반영해야 하는 금융 정보 조회 등 **데이터 정합성(최신 데이터 반영)**이 중요할 때 유리하다. (ex: 계좌 잔액)
217211
- `REPEATABLE READ`: 하나의 비즈니스 로직이 진행되는 동안 데이터의 일관성을 유지하는 것이 더 중요할 때 유리하다. (ex: 결제 시점의 상품 가격, 재고 수량 등)
218212

219213
따라서 개발자는 RDBMS(Oracle, MySQL 등)별 기본 격리 수준을 인지하고, 서비스의 비즈니스 정책과 요구사항을 면밀히 분석하여 각 트랜잭션에 가장 적합한 격리 수준을 적용해야 한다.

0 commit comments

Comments
 (0)