데이터베이스는 여러 곳에서 동시에 접근할 수 있다.
동시에 데이터베이스에 접근해서 데이터를 변경한다면 데이터가 오염될 가능성이 있다.
데이터베이스는 데이터의 일관성과 무결성을 유지하기 위해 Lock을 사용한다.
데이터 일관성
각각의 유저가 일관된 데이터를 보는 것을 말한다.
트랜잭션이 성공적으로 완료되면 모순 없이 일관성 있는 데이터베이스 상태를 보존한다.
데이터 무결성
데이터의 정확성, 일관성, 유효성이 유지되는 것을 말한다.
데이터베이스에 저장된 데이터의 정확성, 일관성, 유효성을 유지하기 위한 제약조건이다.
Lock은 트랜잭션 처리의 순차성을 보장해 주는 기능을 제공하며, 하나의 트랜잭션이 완벽하게 끝날 때까지 다른 트랜잭션의 요청을 막는다.
Lock의 종류
Shared Lock(Read Lock, 공유락)
공유락은 데이터를 읽을 때 사용하는 Lock이다. Shared Lock끼리는 데이터의 일관성과 무결성을 해치지 않기 때문에 동시에 접근이 가능하다. 즉, 리소스를 다른 사용자가 동시에 읽을 수 있게 하되 변경은 불가능하다.
만약 특정 데이터에 Shared Lock이 걸려있다면, Exculsive Lock을 걸 수 없고, 여러 Shared Lock은 동시에 적용될 수 있다.
Exclusive Lock(Write Lock, 베타락)
베타락은 데이터를 변경할 때 사용하는 Lock이다. 하나의 트랜잭션이 완료될 때까지 유지되며, 베타락이 끝날 때까지 어떠한 접근도 허용하지 않는다. Exclusive Lock이 걸리면 Shared Lock을 걸 수 없고, Exclusive Lock 또한 걸 수 없다.
블로킹(Blocking)
블로킹은 Lock 간의 경합(Race Condition)이 발생하여 특정 트랜잭션이 작업을 진행하지 못하고 멈춰 선 상태를 말한다.
접근하는 자원의 고유성을 보장하기 위해, 잠시 다른 트랜잭션의 개입을 막는 것이다.
공유락끼리는 블로킹이 발생하지 않지만, 베타락은 블로킹을 발생시킨다.
블로킹을 피하는 방법
1. 한 트랜잭션의 길이를 길게 하지 않는다. 트랜잭션의 길이가 길 수록 경합의 확률을 올린다.
2. 처음 설계할 때 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 한다.
3. 트랜잭션 격리 수준을 불필요하게 상향하지 않는다.
4. 쿼리를 오랜 시간 잡아두지 않도록 적절한 튜닝을 진행한다.
데드락(Dead Lock, 교착상태)
두 트랜잭션이 각각 Lock을 설정하고 서로의 Lock에 접근하여 값을 얻어오려고 할 때, 서로의 Lock으로 인해 양쪽 트랜잭션이 영원히 처리되지 않는 상태를 말한다. 각각의 자원을 서로 블로킹하여 서로 기다리는 상태이다.
블로킹 vs 데드락
블로킹은 언젠가는 끝나게 된다.
하지만, 데드락은 서로가 서로에게 블로킹을 걸었기 때문에, 상태 트랜잭션이 끝나기만을 서로 기다리며 계속 끝나지 않는다.
'CS > 데이터베이스' 카테고리의 다른 글
스키마 (0) | 2023.07.10 |
---|---|
JOIN (0) | 2023.07.09 |
데이터베이스와 캐시 (0) | 2023.06.28 |
Redis (0) | 2023.06.28 |
RDBMS vs NoSQL (0) | 2023.06.27 |