-
데드락
- 디비의 데드락은 둘 이상의 트랜잭션이 서로 잠금을 포기하기를 기다리는 상황(교착상태)
-
해결방법 : 데드락 탐지
- timeout
- 일정시간이후 트랜잭션이 실행 안됬으면 롤백. 직접적으로 탐지하는건 아니고 일정시간 트랜잭션이 실행되지 않음을 교착상태로 정의
- 장점: 구현 간단, 데드락 빨리 해결 가능
- 단점: 타임아웃 시간 설정 기준 정하기 어려움. 짧으면 불필요한 중단 가능성 길면 데드락 해결에 오랜시간. 실제 데드락 아닌상황인데도 트랜잭션을 중지할 수도 …
- 일정시간이후 트랜잭션이 실행 안됬으면 롤백. 직접적으로 탐지하는건 아니고 일정시간 트랜잭션이 실행되지 않음을 교착상태로 정의
- wait for graph
- tx에 대한 대기 그래프 만들고 해당 그래프에 사이클이 발생됨을 주기적으로 검사
- 대규모 데이터베이스의 경우 모든 tx의 사이클 찾아 데드락 감지하는건 비용이 너무 큼
- timeout
-
보통은 timeout, 데드락 방지 방법을 쓴다
해결방법 : 데드락 방지
애초에 최대한 데드락이 일어나지 않게 방지하는 것
- 격리 수준 변경
- repeatable read → serializable 로 해주는 조치 같은 것
- serializable 아닌 이상 모든 데드락 제거 불가함
- 자원 할당 순서 지정
- 서비스의 논리구조 순서를 바꾸는 것
- wait-die 방법
- 타임스탬프 기반으로 오래된 트랜잭션을 좀 더 우선순위 높게 판단해 이에 따라 대기, 강제종료 등 하는 방식을 가진 비선점기법
- 오래된 tx == 더 작은 타임스탬프 가짐
- 타임스탬프 기반으로 오래된 트랜잭션을 좀 더 우선순위 높게 판단해 이에 따라 대기, 강제종료 등 하는 방식을 가진 비선점기법
- wound - wait
- 타임스탬프 기반으로 오래된 트랜잭션을 좀 더 우선순위 높게 판단해 이에 따라 대기, 강제종료 등 하는 방식을 가진 선점기법