교착상태란 무엇인가요?
면접용 답변
교착 상태는 여러 트랜잭션이 서로가 보유한 자원을 기다리면서 무한 대기 상태에 빠지는 것을 의미합니다.
예를 들어, 트랜잭션 A는 자원 1을 점유하고 자원 2를 기다리고 있고, 트랜잭션 B는 자원 2를 점유한 채 자원 1을 기다리는 상황입니다. 이런 경우 서로가 서로의 락이 풀리길 기다리기 때문에 교착 상태가 발생합니다.
개념 설명
LOCK
데이터베이스에서는 기본적으로 트랜잭션들의 동시성을 제어하기 위해 Lock을 사용함.
이 Lock의 부작용으로 교착상태가 발생할 수 있는 것!
✏️ Lock vs Transaction Lock 은 데이터의 일관성을 보장하기 위함 Transaction 은 데이터의 정합성을 보장하기 위함
교착 상태의 4가지 조건
교착상태는 아래의 4가지 조건이 모두 충족되면 발생합니다.
상호 배제 : 자원은 한 번에 하나의 트랜잭션만 사용할 수 있음
점유 대기 : 트랜잭션이 자원을 점유한 상태에서는 다른 자원을 기다림
비선점 : 다른 트랜잭션이 점유한 자원을 강제로 빼앗을 수 없음
순환 대기 : 트랜잭션들 사이에 자원을 순환적으로 기다림
교착 상태의 해결 전략
(예방) 자원을 할당할 때 애초에 조건이 성립되지 않도록 설계
(회피) 교착상태 가능성이 없을 때만 자원을 할당하고, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 은행원 알고리즘을 사용
(탐지) 교착 상태가 발생하면 사이클이 있는지 찾아보고, 이에 관련된 프로세스를 한 개씩 지움
(복구) 교착 상태가 발생하면 트랜잭션 중 일부를 강제 종료해 해결
각 해결방안에 대해 더 자세히 살펴보겠슴다
- 예방
교착 상태가 아예 발생하지 않게 설계하는 것
상호 배제 제거: 자원 공유 허용 (실제 DB에선 거의 불가능)
점유 대기 제거: 자원을 한꺼번에 요청하게 강제 (ex. 모든 자원을 다 얻을 때까지 작업 시작하지 않음)
비선점 허용: 다른 트랜잭션의 자원을 강제로 뺏음 (예: 오래 기다리면 롤백시키고 자원 반환)
순환 대기 제거: 자원에 고유한 번호를 매겨 항상 작은 번호부터 요청
- 회피
현재 자원 상태와 요청을 분석해서 위험 상태로 갈 가능성이 있으면 거절하는 방식
과부화 때문에 현실 DBMS에선 거의 사용되지 않음
✏️ 은행원 알고리즘 회피 방식의 대표적 알고리즘 총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 또는 불안정 상태로 나누고 안정상태로 가도록 자원을 할당하는 알고리즘
- 탐지 & 복구
실전에서 가장 많이 사용되는 전략!
사이클이 생기면 교착 상태로 판단, 트랜잭션 중 하나를 강제 종료
MySQL InnoDB, Oracle DB 등에서 실제 사용됨
교착 상태 예방하기!
락 순서를 통일해서 여러 트랜잭션이 항상 동일한 순서로 자원에 접근하도록 설정
트랜잭션을 최소화하기
상황에 따라 낙관적/비관적 락을 도입하기
Reference
면접을 위한 CS 전공지식 노트 https://parkmuhyeun.github.io/etc/database/2022-07-03-Deadlock/ https://velog.io/@yrkim/Database-트랜잭션-deadlock
Last updated