교착상태 (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 이 걸려 있으니 영원히 풀리지 않음

https://t1.daumcdn.net/cfile/tistory/243E89355714C26E28

=> 그렇기 때문에 교착상태 (DeadLock) 이 발생하는 경우 DBMS 가 한 트랜잭션에 에러를 일으키면서 문제를 해결

DeadLock 발생 조건

  • 한 시스템 내 네가지 조건이 동시에 성립할 때 발생 => 하나라도 성립하지 않도록 만든다면 교착 상태 해결 가능
  1. 상호 배제

    한번에 하나의 프로세스만 해당 자원을 사용할 수 있다. 즉, 자원을 동시에 사용할 수 없는 경우

    ➡️ 여러 개의 프로세스가 공유 자원을 사용하도록 함

  2. 점유 대기

    자원을 붙잡은 상태로 다른 자원을 기다리고 있다

    자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 한다

    ➡️ 프로세스가 실행되기 전 필요한 모든 자원을 할당

  3. 비선점

    이미 할당된 자원을 강제로 빼앗을 수 없다

    ➡️ 자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고 있는 자원을 반납하고, 요구한 자원을 사용하기 위해 기다리게 한다.

  4. 순환 대기

    대기 프로세스의 집합이 순환 형태로 자원을 대기해야 한다

    ➡️ 자원에 고유한 번호를 할당하고, 번호 순서대로 자원을 요구하도록 한다

레퍼런스

[MySQL InnoDB lock & deadlock 이해하기](