✨ Lock ?
고가의 DBMS를 사용하는 이유는 여러가지 측면이 있지만, 무엇보다 트랜잭션 처리 능력이 가장 기본적이고 핵심적인 요소라고 볼 수 있다. 같은 자원을 엑세스하려는 다중 트랜잭션 환경에서 데이터베이스의 일관성, 무결성을 유지하기 위해서는 트랜잭션의 순차적 진행을 보장할 수 있는 직렬화(Serialization) 장치가 필요하다.
직렬화가 가능하도록 하기 위해 사용하는 메커니즘이 Lock이며, DBMS마다 구현하는 방식과 세부적 기능이 많이 다르다.
🪡 Lock의 상태
🐣공유 Lock과 배타적 Lock
DBMS는 각 트랜잭션의 오퍼레이션별로 적당한 수준의 Lock을 자동 설정한다. 그러나 필요할 경우, 일부 Lock에 대해서는 사용자가 직접 제어하는 방법도 제공한다.
1) 공유 Lock
공유(Shared) Lock은 데이터를 읽고자 할 때 사용된다. 다른 공유 Lock 과는 호환되지만, 배타적 Lock과는 호환되지 않는다. 즉, 공유 Lock을 설정한 리소스에 다른 트랜잭션이 추가로 공유Lock을 설정할 수는 있지만, 배타적 Lock은 불가능하다. 결국 자신이 읽고 있는 리소스를 다른 사용자가 동시에 읽을 수는 있지만, 변경은 불가능하다는 것이다. 반대로, 다른 사용자가 읽고 있는 리소스를 동시에 읽는 것은 가능하지만 변경 중인 리소스는 동시에 읽을 수 없다.
2) 배타적 Lock
배타적(Exclusive) Lock은 데이터를 변경하고자 할 때 사용되며, 트랜잭션이 완료될 때까지 유지된다. Lock이 해제될 때까지 다른 트랜잭션은 해당 리소스에 접근이 불가능하다. 읽기가 동시에 가능한 반면, 읽기 및 변경이 불가능하다. 반대로, 다른 트랜잭션에 의해 Lock이 설정된 리소스는, 그것이 공유Lock이든 배타적 Lock이든 배타적 Lock을 동시에 설정할 수 없다.
*호환된다 : 한 리소스에 두 개 이상의 Lock을 동시 설정할 수 있다.
🐤 블로킹과 교착상태
1) 블로킹
블로킹(Blocking)은 Lock 경합이 발생해 특정 세션이 작업을 진행하지 못하고 멈춘 상태를 말한다. 공유 Lock끼리는 호환되기 때문에 블로킹이 발생하지 않지만, 공유 Lock과 배타적 Lock은 호환되지 않아 블로킹 발생 가능성이 있다. 이 상태를 해소할 수 있는 방법은 commit(또는 rollback)만이 존재한다.
그렇기 때문에 이와 같은 현상이 빈번히 일어나지 않도록 주의가 필요하다.
2) 교착상태
교착상태(Deadlock)는, 두 세션이 각각 Lock을 설정한 리소스를 서로 엑세스하려고 마주보며 진행하는 상황을 말하며, 둘 중 하나가 물러나지 않으면 영영 풀릴 수 없다. 발생 가능성을 줄이기 위해서는 테이블 접근 순서를 같게 처리함으로 인하여 피할 수 있다.
'DBMS' 카테고리의 다른 글
동시성 제어 (0) | 2024.04.17 |
---|---|
트랜잭션 (0) | 2024.04.16 |
데이터베이스 I/O 원리 (0) | 2024.04.12 |
SQL 파싱 부하 (0) | 2024.04.09 |
데이터베이스 아키텍처 (0) | 2024.04.08 |