운영체제에서 프로세스 간의 자원 점유로 인한 Deadlock을 배웠는데 DB 데드락도 생각나서 글을 쓴다.
DB Deadlock
정의 : 데이터베이스에서 교착 상태는 둘 이상의 트랙잭션이 서로가 잠금을 포기하기를 기다리는 상황이다.
lock일어나는 이유를 알아보자. 예를 들어 DML(select, insert, update, delete)를 하게 되면
먼저 Lock이되고 테이블에 대한 처리를 하기 때문에 발생하는 것이다.
다음 이미지를 보자.

테이블 A와 B가 있다. 서로를 참조해서 작업 수행해야 하는데 서로 lock이 걸려 있어서 접근할 수 없는데
계속해서 기다리는 상황이 되는 것이다. 그렇다면 해결방법을 알아보자
해결방법
1) 교착상태 감지 및 TimeOut
일정시간이후 트랙잭션이 실행되지 않았을 경우 롤백
● 격리수준 변경 → 교착 상태를 방지하기 위해 격리수준을 행수준 잠금 또는 격리 수준을 조정하는 것
● 서비스의 로직을 교차되지 않게 수정 ex) A라는 테이블이 먼저 실행되고 B가 실행되야 한다.
● wait-die 또는 wound wait : 타임스탬프를 기반으로 트랙잰션을 대기, 선점, 종료하기 방식
- wait-die : 오래된 테이블이 참조하면 대기하고 최신 테이블이 참조하면 종료시킨다.
- wound-wait : 오래된 테이블이 참조하면 오래된 테이블에게 선점당하고 최신 테이블이 참조하면
대기한다.
2) 그래프기반으로 사이클 탐색
그래프 내의 사이클이 형성되었다는 것을 기반으로 교착상태를 감지
→ 대규모 데이터베이스의 경우 일일히 감지하기에 너무나 코스트가 크기 때문에 잘 쓰지 않는다.
'DB > Error' 카테고리의 다른 글
| network adapter could not establish the connection (0) | 2024.06.17 |
|---|