--목차---
1. 교착상태?
2. 교착상태를 탐지하는 방법
3. 교착상태 빈도를 낮추는 법
--------
1. 교착상태(Deadlock)?
1) 정의
2개 이상의 트랜잭션이 특정 자원(테이블 또는 행)의 잠금(Lock)을 획득한 채 다른 트랜잭션이 소유하고 있는 잠금을 요구하면 아무리 기다려도 상황이 바뀌지 않는 상태.(무한 대기 상태)
2) 발생 배경
복수의 트랜잭션을 사용하는 경우 발생
3) 예시
MySQL MVCC에 따른 특성 때문에 트랜잭션에서 갱신 연산(INSERT, UPDATE, DELETE)를 실행하면 잠금을 획득한다.
(기본은 행에 대한 잠금)

트랜잭션 1이 첫 번째 행의 잠금을 얻고 트랜잭션 2도 테이블 A의 첫 번째 행의 잠금을 얻은 경우이다.
트랜잭션을 Commit하지 않으 채 서로의 첫 번째 행에 대한 첫 번째 행에 대한 잠금 요청시 Deadlock 발생.
4) 발생 조건 (해당 조건에 대한 예방 방법)
- 상호배제
- 트랜잭션이 자원을 베타적으로 점유하여 다른 트랜잭션이 자원 사용 불가.
- (공유할 수 없는 자원 사용)
- 점유와 대기
- 트랜잭션은 자원을 점유하고, 다른 자원 요구
- (불가능, 기아 상태 발생)
- 비선점
- 트랜잭션에 할당된 자원은 점유한 트랜잭션에 의해 해제될 때까지 다른 트랜잭션에 의해 해제 불가.
- (비용 증가, 기아 상태 발생, 일부 자원은 안전하게 선점불가)
- 순환대기
- 트랜잭션 간 자원 요청이 하나의 원형 체임으로 구성
- (새 자원 추가시 재구성 필요)
2. 교착 상태 탐지 방법
Union-Find 알고리즘 사용.(Cycle 존재 여부로 교착 상태 발생 확인 가능)
3. 교착상태 빈도를 낮추는 방법
1) 예방 기법
- 각 트랜잭션이 실행되기 전에 필요한 데이터 모두 Locking해주는 방법.
- 데이터가 많이 필요하면 모든 데이터를 전부 Locking해줘야 하므로 트랜잭션의 병행성 보장 불가.
- 몇몇 트랜잭션은 기아상태 발생 가능.
2) 회피 기법
- 자원을 할당할 때 시간 스탬프(Time Stamp)를 사용해 교착상태가 일어나지 않도록 회피하는 방법.
- 예방 기법의 단점을 해결하기 위해 나옴.
ㄱ. Wait-Die
- 다른 트랜잭션이 데이터를 점유하고 있을 때 기다리거나 포기하는 방식.
- 트랜잭션 Ti가 Tj에 의해 Locking된 데이터를 요청할 때 Ti가 먼저 들어온 트랜잭션이면 기다림.
- Ti가 나중에 들어온 트랜잭션이면 포기하고 나중에 요청.
ㄴ. Wound-Wait
- 다른 트랜잭션이 데이터를 점유하고 있을 때 빼앗거나 기다리는 방식.
- 트랜잭션 Ti가 Tj에 의해 Locking된 데이터를 요청할 때 Ti가 먼저 들어온 트랜잭션이라면 데이터를 선점.
- 나중에 들어온 트랜잭션일 경우 기다림.
3) 낙관적 병행 제어 기법
- 트랜잭션이 실행되는 동안 검사를 수행하지 않고, 트랜잭션이 커밋된 후에 데이터에 문제가 있다면 롤백하는 기법.
- 판독 -> 확인 -> 기록 단계로 구성.
4) 빈도 줄이기 기법
- 트랜잭션 자주 커밋
- 정해진 순서대로 테이블에 접근하기.(트랜잭션들이 동일한 테이블 순으로 접근하게 하기)
- 읽기 잠금 획득(SELECT ~ FOR UPDATE)의 사용을 피한다.
- 테이블 단위의 잠금을 획득해 갱신을 직렬화한다.
- 한 테이블 복수 행을 복수의 연결에서 순서 없이 갱신할 경우
- 동시성은 떨어지지만 교착상태 회피 가능
- Index 설계(Update시 Index를 타지 않으면 테이블 전체에 Lock 걸림)
- Isolation level을 낮춘다.(서비스 검토 필요)
- 프로시저 우선순위 설정
참조
https://itpenote.tistory.com/624
https://jaehoney.tistory.com/162?category=887684
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Database#index
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ndb796&logNo=221243161017
데이터베이스 교착 상태(Dead Lock)
데이터베이스에서 교착 상태(Dead Lock)란 여러 개의 트랜잭션(Transaction)들이 실행을 하지 못...
blog.naver.com