데이터베이스 시스템에서 동시성과 동시성 제어
동시성 (Concurrency)
- 동시성은 여러 트랜잭션이 동시에 실행되는 것을 의미합니다.
- 데이터베이스는 여러 사용자의 요청을 처리해야 하므로 동시성은 필수적입니다.
- 동시성을 효과적으로 처리하면 응답 시간이 줄고 시스템 자원의 효율적인 활용이 가능합니다.
동시성으로 인한 문제점
동시성은 성능을 향상시키지만, 잘못 관리하면 데이터 무결성을 해칠 수 있습니다.
1. Dirty Read (더티 읽기)
- 한 트랜잭션이 커밋되지 않은 데이터를 읽는 경우.
- 예: A 트랜잭션이 데이터를 수정했지만 아직 커밋하지 않았는데, B 트랜잭션이 이를 읽습니다.
2. Non-Repeatable Read (비반복 읽기)
- 동일 트랜잭션에서 같은 데이터를 두 번 읽을 때 값이 달라지는 상황.
- 예: 첫 번째 읽기 후, 다른 트랜잭션이 데이터를 수정하거나 삭제한 경우.
3. Phantom Read (팬텀 읽기)
- 한 트랜잭션이 같은 쿼리를 반복 실행할 때 새로운 행이 추가되거나 기존 행이 삭제된 상황.
- 예: 범위를 검색한 결과가 다른 트랜잭션의 삽입/삭제로 인해 달라지는 경우.
4. Lost Update (갱신 손실)
- 두 트랜잭션이 동시에 데이터를 수정하여 한 트랜잭션의 변경사항이 유실되는 경우.
- 예: A와 B가 동일한 값을 업데이트하지만, B가 A의 결과를 덮어씌움.
동시성 제어 방법
동시성 제어는 트랜잭션 간의 상호작용을 조율하여 데이터 무결성을 보장합니다.
1. 락(Lock) 기반 제어
- 트랜잭션이 데이터에 접근할 때 락(잠금)을 설정하여 다른 트랜잭션의 접근을 제한합니다.
1) 락의 종류
2) 문제점과 해결책
- 문제점: 교착 상태(Deadlock) 발생 가능.
- 해결책: 타임아웃 설정 또는 락 순서를 명시하여 교착 상태를 방지.
2. 낙관적 동시성 제어 (Optimistic Concurrency Control)
- 데이터에 락을 사용하지 않고, 트랜잭션 완료 시 데이터의 변경 충돌 여부를 확인.
- 데이터 충돌 발생 시, 트랜잭션을 롤백 후 재시도.
- 충돌 가능성이 낮은 환경에서 적합.
예시:
SELECT balance FROM accounts WHERE id = 1;
UPDATE accounts
SET balance = balance - 100
WHERE id = 1 AND last_updated = '2023-12-18 10:00:00';
- last_updated를 확인하여 충돌 여부를 판단.
3. 타임스탬프 순서 제어 (Timestamp Ordering)
- 트랜잭션이 시작될 때 타임스탬프를 할당하고, 이를 기준으로 트랜잭션 실행 순서를 보장.
- 읽기/쓰기 충돌 발생 시 충돌 트랜잭션을 롤백.
4. 다중 버전 동시성 제어 (MVCC)
- 데이터를 수정할 때 기존 데이터를 유지하고 새로운 버전을 생성.
- 각 트랜잭션은 자신이 시작된 시점의 데이터 버전을 사용.
- 읽기와 쓰기가 충돌하지 않으므로 읽기 성능이 뛰어남.
사용 사례: PostgreSQL, MySQL (InnoDB)
트랜잭션 격리 수준 (Transaction Isolation Levels)
SQL 표준에서는 트랜잭션 격리 수준을 제공하여 동시성 제어의 강도를 조절합니다.
-
Read Uncommitted
- 커밋되지 않은 데이터 읽기 허용.
- 성능은 높지만 데이터 무결성이 약함.
-
Read Committed
- 커밋된 데이터만 읽을 수 있음.
- Dirty Read 방지.
-
Repeatable Read
- 동일 트랜잭션에서 동일 데이터를 읽을 때 항상 같은 결과.
- Dirty Read, Non-Repeatable Read 방지.
-
Serializable
- 가장 엄격한 수준.
- 트랜잭션이 순차적으로 실행되는 것처럼 동작.
- Dirty Read, Non-Repeatable Read, Phantom Read 모두 방지.
결론
- 데이터베이스 시스템에서 동시성은 성능과 데이터 무결성 사이의 균형을 요구합니다.
- 락, 낙관적 동시성 제어, MVCC 등 다양한 동시성 제어 기법을 활용하여 문제를 방지할 수 있습니다.
- 애플리케이션의 요구 사항과 트랜잭션 특성에 따라 적절한 제어 방법과 격리 수준을 선택해야 합니다.
추가 학습 자료