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