개발하며 가장 고민하게 되는 문제중 하나가 바로 동시성 문제라고 생각한다.
예로, 두 트랜잭션이 동일한 데이터를 갱신할 때, 마지막 트랜잭션 내용만 반영되여 다른 트랜잭션 작업이 유실되는 문제이다.이것을 갱신손실문제라고 한다.
ex) 게임을 하고있을때 피가 10인데, 치유 50과 공격 30이 동시에 들어왔는데, 가장 마지막에 들어온 공격만 들어와서 내 캐릭은 죽어버림 (치유 작업은 유실!)
그럼 이러한 문제를 어떻게 해결하느냐
그 방법 바로 Lock이다.
DB 락
- 트랜잭션 간 충돌을 방지하기 위해 데이터 대한 접근을 제한한다.
- Shared Lock: 읽기 전용 트랜잭션을 위한 락.
- Exclusive Lock: 쓰기 트랜잭션을 위한 락.
DB 데드락
- 두 개 이상의 트랜잭션이 서로의 락을 기다리면서 무한 대기
- 해결 : 타임 아웃 설정
- 트랜잭션 순서를 정렬하려 충돌 방지
DB 회복
- 장애 발생 시 데이터베이스를 일관된 상태로 복구하는 절차.
- 해결:
- UNDO : 트랜잭션의 변경 내용을 취소하여 이전 상태로 되돌린다.
- REDO: 트랜잭션의 변경 내용을 재적용하여 Commit된 상태로 복구한다.
체크포인트 회복 기법
- 데이터베이스가 주기적으로 체크포인트를 생성하여 장애 발생 시 그 시점부터 복구를 시작한다.
- 복구 시간을 줄이고, 시스템 가용성을 높인다.
'Database' 카테고리의 다른 글
[데이터베이스] Transaction (트랜잭션) (1) | 2024.11.28 |
---|---|
[데이터베이스] 이상과 정규화 (0) | 2024.11.21 |
[데이터베이스] 인덱스 (2) | 2024.11.14 |
[데이터베이스] B-Tree 인덱스와 B+Tree 인덱스 (0) | 2024.11.13 |
[데이터베이스] 순차 I/O와 랜덤 I/O (2) | 2024.11.12 |