다중 트랜잭션에서 발생할 수 있는 읽기 및 쓰기 문제
문제 유형 | 설명 | 예시 |
Dirty Read | 커밋되지 않은 데이터를 읽는 상황 | T1이 피자 가격을 2만 원으로 변경 중, T2가 이 가격을 읽고 T1이 롤백되면 T2의 결과는 잘못된 값이 된다. |
Non-Repeatable Read | 같은 트랜잭션 내에서 데이터 값이 달라지는 상황 | T1이 피자 가격을 3만 원으로 읽고, T2가 2만 원으로 변경 후 커밋, T1이 다시 읽을 때 2만 원으로 변경된 값을 읽는다. |
Phantom Read | 트랜잭션 중에 새로운 데이터가 추가되거나 기존 데이터가 삭제되어 결과가 달라지는 상황 |
T1이 1만 원 이하의 피자를 조회하고, T2가 1만 원 이하로 피자를 추가 후 T1이 다시 조회 시 새 피자가 포함된다. |
Dirty Write | 커밋되지 않은 트랜잭션이 다른 트랜잭션의 데이터를 덮어쓰는 상황 |
T1이 피자 가격을 2만 원으로 변경 중, T2가 같은 가격을 3만 원으로 변경하고 커밋, T1의 변경이 사라진다. |
Lost Update | 두 개 이상의 트랜잭션이 동일한 데이터를 동시에 갱신하려 할 때, 하나의 트랜잭션 결과가 다른 트랜잭션에 의해 덮어쓰여지는 상황 |
T1과 T2가 동시에 피자 가격을 변경할 때, T1의 가격 변경이 T2의 커밋으로 덮어써져서 사라진다. |
Read Skew | 트랜잭션 내에서 데이터의 일관성이 보장되지 않는 상황, 하나의 트랜잭션에서 다른 트랜잭션이 커밋한 변경 사항이 반영되지 않는 경우 |
T1이 재고 수량을 읽고, T2가 재고를 수정하고 커밋, T1이 다시 재고를 읽을 때 T2의 변경 사항이 반영되지 않는다. |
Write Skew | 두 개의 트랜잭션이 동일한 데이터 집합을 기반으로 서로 다른 쓰기 작업을 수행할 때 발생하는 일관성 문제 |
T1과 T2가 동시에 다른 할인 정책을 적용하여 커밋하면, 최종 결과가 예상과 다를 수 있다. |
Isolation Level
- 1992년 11월에 발표된 SQL 표준에서 정의된 내용.
- 애플리케이션 설계자는 Isolation Level을 통해 전체 처리량(throughput)과 데이터 일관성 사이에서 적절한 균형을 맞출 수 있다.
- RDBMS마다 제공하는 Isolation Level이 다르며, 같은 이름이라도 동작 방식이 다를 수 있다.
Read Uncommitted | Read Committed | Repeatable Read | Serializable | |
설명 | 가장 낮은 수준의 격리 커밋되지 않은 데이터를 읽을 수 있으며 데이터 일관성이 보장되지 않는다. |
커밋된 데이터만 읽을 수 있지만, 같은 트랜잭션 내에서 데이터 값이 달라질 수 있다. | 같은 트랜잭션 내에서 일관된 데이터 값을 보장하지만, 새로운 데이터의 삽입으로 인해 조회 결과가 변경될 수 있다. | 가장 높은 수준의 격리로, 모든 트랜잭션이 직렬적으로 실행된 것처럼 동작하며 데이터 일관성이 완벽하게 보장된다. |
Dirty Read | O | X | X | X |
Non-Repeatable Read | O | O | X | X |
Phantom Read | O | O | O | X |
Dirty Write | O | X | X | X |
Lost Update | O | O | X | X |
Read Skew | O | O | O | X |
Write Skew | O | O | O | X |
Snapshot Isolation
Snapshot Isolation은 데이터의 일관성을 보장하기 위해 MVCC(다중 버전 동시성 제어)를 사용하는 격리 수준이다. 트랜잭션은 자신이 시작된 시점의 데이터 스냅샷을 보고, 다른 트랜잭션의 커밋된 변경 사항이 현재 트랜잭션의 읽기 작업에 영향을 미치지 않는다. Write-Write 충돌이 발생하면 First-committer wins 정책을 적용하여 먼저 커밋된 트랜잭션이 우선한다.
- 특징:
- Write-Write 컨플릭트 발생 시 First-committer wins.
- 트랜잭션이 시작되기 전 커밋된 데이터만 보인다.
- MVCC를 사용하여 트랜잭션 간의 충돌을 최소화.
- 주로 Serializable 수준의 격리와 유사하지만, 성능을 향상시키기 위한 특정 구현 방식이 다를 수 있다.
728x90
'Database' 카테고리의 다른 글
[DB] MVCC (Multiversion Concurrency Control) (0) | 2024.08.17 |
---|---|
[DB] Lock & 2PL (0) | 2024.08.17 |
[DB] Recoverability (0) | 2024.08.16 |
[DB] Serializability (0) | 2024.08.16 |
[DB] Trigger (0) | 2024.08.16 |