두 개 이상의 프로세스나 스레드가 서로 자원을 얻지 못해서 다음 처리를 하지 못하는 상태
무한히 다음 자원을 기다리고 있음
시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생
데이터베이스의 관점에서는 Transaction간 발생하는 것을 의미
상호 배제 (Mutual Exclusion)
자원은 한번에 한 프로세스만 사용할 수 있다.
점유 대기 (Hold and Wait)
프로세스가 한 개의 자원을 점유하고 있고 추가적으로 다른 프로세스의 자원을 점유하기 위해서는 대기 해야 한다.
비선점 (Non-Preemption)
점유 되어 있는 자원은 강제로 해제할 수 없고, 프로세스가 자원의 사용을 자발적으로 해제하기 전까지 그 자원은 얻을 수 없다.
순환 대기 (Circular Wait)
자원과 자원을 사용하기 위해 대기하는 프로세스들이 원형으로 구성되어 있어 자신에게 할당된 자원을 점유하면서 앞이나 뒤에 있는 프로세스의 자원을 요구해야 한다.
네 가지의 조건을 모두 충족해야 교착 상태 발생.
⇒ 네 가지의 조건 중 한 가지만 제거한다면 교착 상태가 발생하지 않을 수 있다.
예방 (Prevention)
Dead Lock의 발생 조건 중 한 가지를 발생하지 않도록 하는 방법
Dead Lock 발생 가능성 차단
대체적으로 자원 낭비가 심하다.
상호 배제 조건 방지
점유 대기 조건 방지
비선점 조건 방지
순환 대기 조건 방지
회피 (Avoidance)
교착 상태 발생 시 피해 나가는 방법 ex. 은행원 알고리즘
Safe State
Safe Sequence
이런 것을 찾는 것이 은행원 알고리즘
탐지 및 회복 (Detection and Recovery)
탐지
Allocation, Request, Available 등으로 시스템에 데드락이 발생했는지 여부를 탐색
자원 할당 그래프를 통해 교착 상태 탐지도 가능
회복 (탐지를 통해 데드락을 발견하면)
프로세스 중단 : 데드락이 탐지된 모든 프로세스 종료, 하나의 프로세스 중단 후 데드락 다시 탐지 및 프로세스 중단 반복
자원 선점 : 프로세스에 할당된 자원을 선점해서, 교착 상태를 해결할 때까지 그 자원을 다른 프로세스에 할당해 주는 방법
데이터의 무결성을 보장하기 위한 방법 중 한가지
같은 데이터를 사용자가 동시에 업데이트 하는 것을 막기 위해 사용
락이 걸린 데이터는 락이 풀릴 때까지 다른 사용자가 조작할 수 없음
COMMIT
, ROLLBACK
이후에 Lock이 풀린다.
공유 Lock (Shared Lock, Read Lock)
데이터를 읽을 때 사용
내가 보고 있는 데이터를 다른 사용자가 볼 수는 있지만 변경은 불가능
배타적 Lock (Exclusive Lock, Write Lock)
데이터를 변경할 때 사용
읽기와 쓰기가 불가능
Blocking
Lock들이 경합이 발생하여 특정 세션이 작업을 진행하지 못하고 멈춰선 상태
공유 & 배타적, 배타적 & 배타적끼리 Blocking 발생
해결하기 위해서는 COMMIT
또는 ROLLBACK
필요