전산직/데이터베이스

트랜잭션 동시성 제어 미수행 시 발생하는 문제

glorypang 2025. 11. 10. 22:03
728x90
반응형
SMALL

트랜잭션과 동시성 제어란?

  • 트랜잭션(Transaction)
    : 데이터베이스의 논리적 작업 단위
    (여러 연산을 하나의 작업처럼 처리)
  • 동시성 제어(Concurrency Control)
    : 여러 트랜잭션이 동시에 수행될 때 데이터의 일관성을 유지하기 위한 제어 메커니즘
    예) Lock, Timestamp Ordering, 2PL(2단계 잠금) 등

동시성 제어를 하지 않으면 여러 트랜잭션이 같은 데이터를 동시에 갱신하거나 읽을 때
데이터 불일치·손실·왜곡 현상이 발생


동시성 제어 미수행 시 발생하는 주요 문제

구분  문제   예시
① 갱신 손실
(Lost Update)
한 트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어써서 첫 번째 갱신이 사라지는 현상 T1이 X=100→X=150으로 변경 후,
T2가 X=200으로 갱신하면 T1의 변경이 사라짐
② 오손 읽기
(Dirty Read)
한 트랜잭션이 아직 커밋되지 않은 변경값을 다른 트랜잭션이 읽는 현상 T1이 X=150으로 변경했지만 롤백
→ T2가 150을 읽었으나 실제 DB엔 100만 존재
③ 반복할 수 없는 읽기
(Non-repeatable Read)
한 트랜잭션이 같은 데이터를 두 번 읽는 동안 다른 트랜잭션이 데이터를 변경하여 읽을 때마다 값이 달라지는 현상 T1이 X=100을 읽은 후 T2가 X=200으로 변경
→ T1이 다시 읽으면 X=200
④ 부정확한 요약
(Phantom Read)
조건 검색 결과(집합 데이터)가 트랜잭션 도중 달라지는 현상 (다른 트랜잭션이 삽입/삭제한 경우) T1이 “급여 > 3000인 사원 수” 조회 중, T2가 새 사원을 추가 → T1이 다시 조회하면 결과 다름

문제별 예시 시나리오

(1) 갱신 손실 (Lost Update)

T1: X = X + 10   (100 → 110)
T2: X = X + 20   (100 → 120)
결과: X = 120  ← T1의 변경(110)이 사라짐

원자성(Atomicity) 위배 + 데이터 불일치 발생

(2) 오손 읽기 (Dirty Read)

T1: UPDATE balance = 500 (아직 commit 안 함)
T2: SELECT balance → 500 읽음
T1: ROLLBACK (원래 400으로 복구)

T2가 존재하지 않는 값(500)을 읽음 → 잘못된 데이터 사용

(3) 반복할 수 없는 읽기 (Non-repeatable Read)

T1: SELECT X → 100
T2: UPDATE X = 200; COMMIT
T1: SELECT X → 200

같은 트랜잭션 내에서도 값이 달라짐

(4) 부정확한 요약 (Phantom Read)

T1: SELECT SUM(salary) WHERE dept='IT'  → 3000
T2: INSERT INTO employee VALUES('IT', 1000); COMMIT
T1: SELECT SUM(salary) WHERE dept='IT'  → 4000

집합 결과가 중간에 달라짐 → 팬텀(Phantom) 이 생김


4. 문제 해결 방법

해결 기법  설명
Locking (잠금) 데이터 접근 시 공유/배타 잠금을 걸어 동시에 접근 방지
2PL (2단계 잠금) 트랜잭션은 잠금을 확장단계 → 축소단계로만 진행
Timestamp Ordering 트랜잭션 시작 시간 기준으로 접근 순서 제어
Optimistic Concurrency Control 충돌 가능성 낮을 때 사후 검증(Validation)으로 제어

 

728x90
반응형
LIST