교착상태 (DeadLock)
교착상태 (DeadLock)
DeadLock 이란 ?
: 두 트랜잭션이 각각 Lock을 설정하고 다음 서로의 Lock에 접근하여 값을 얻어오려고 할 때 이미 각각의 트랜잭션에 의해 Lock이 설정되어 있기 때문에 양쪽 트랜잭션 모두 영원히 처리가 되지않게 되는 상태
EX)
트랜잭션 A가 Resoucre1 데이터를 수정 (Resoucre1 에 X Lock) -> Resocure2 데이터 수정
트랜잭션 B가 Resoucre2 데이터를 수정 (Resoucre2 에 X Lock) -> Resocure1 데이터 수정
하려고 할 때 A는 Resource2 에 베타 Lock 을 B 는 Rescoure1 에 베타 Lock 을 걸려고 하는데 이미 베타 Lock 이 걸려 있으니 영원히 풀리지 않음
=> 그렇기 때문에 교착상태 (DeadLock) 이 발생하는 경우 DBMS 가 한 트랜잭션에 에러를 일으키면서 문제를 해결
DeadLock 발생 조건
- 한 시스템 내 네가지 조건이 동시에 성립할 때 발생 => 하나라도 성립하지 않도록 만든다면 교착 상태 해결 가능
-
- 상호 배제
-
한번에 하나의 프로세스만 해당 자원을 사용할 수 있다. 즉, 자원을 동시에 사용할 수 없는 경우
➡️ 여러 개의 프로세스가 공유 자원을 사용하도록 함
-
- 점유 대기
-
자원을 붙잡은 상태로 다른 자원을 기다리고 있다
-
자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 한다
➡️ 프로세스가 실행되기 전 필요한 모든 자원을 할당
-
- 비선점
-
이미 할당된 자원을 강제로 빼앗을 수 없다
➡️ 자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고 있는 자원을 반납하고, 요구한 자원을 사용하기 위해 기다리게 한다.
-
- 순환 대기
-
대기 프로세스의 집합이 순환 형태로 자원을 대기해야 한다
➡️ 자원에 고유한 번호를 할당하고, 번호 순서대로 자원을 요구하도록 한다
레퍼런스
[MySQL InnoDB lock & deadlock 이해하기](