데이터베이스가 데드락을 감지하고 처리하는 방식 #49
Replies: 4 comments
-
데드락 감지MySQL은 WFG(Waiting-For-Graph)를 기반으로 탐지합니다. MySQL DeadLock Detection WFG는 Thread와 Resource로 이루어진 자원할당 그래프에서 Resource노드를 제거하고 프로세스 간 대기 관계만 남긴 그래프입니다.
데드락 처리MySQL에서는 데드락이 발견되면 하나의 트랜잭션이나 작은 단위의 트랜잭션을 롤백합니다. 이때 기준은 INSERT, UPDATE, DELETE 쿼리 수에 따라서 결정합니다. 조금 더 찾아보니, TRX_WEIGHT라는 트랜잭션 가중치에 따라 결정되며, 이는 트랜잭션이 변경한 행수와 잠근 행수를 반영한다고 합니다! 이 트랜잭션 가중치가 가장 작은 트랜잭션을 희생하여 롤백합니다.
|
Beta Was this translation helpful? Give feedback.
-
|
데이터베이스는 데드락 상황에서 전체가 멈추는 것이 아니라, |
Beta Was this translation helpful? Give feedback.
-
|
결론을 먼저 이야기 하자면 데드락이 감지돼도 데이터베이스는 멈추지 않습니다. 데드락은 둘 이상의 트랜잭션이 서로 쥐고 있는 락을 기다리며 어떻게 데드락을 감지하고, 해결할까?1. 대기 그래프 (wait-for Graph)대기 그래프 (wait-for Graph)를 통해서 트랜잭션, 간선 별로 T1 → T2 형태로 해당 그래프를 검사하는 트리거 방식은 DB 마다 다르다고 합니다. 능동 감지 (MySQL InnoDB)락 요청이 대기에 들어갈 때마다 대기 그래프에서 사이클을 검사한다. 타임아웃 트리거 감지 (PostgreSQL)평소에 검사를 돌지 않다가, 락 대기가 순수 타임아웃
2. 희생자 선정 후 강제 롤백데드락 사이클이 판단되면 DB는 한 트랜잭션을 골라 롤백해 연결을 끊는다. InnoDB는 보통 수정한 행이 가장 적은 트랜잭션을 희생자로 삼는다. MySQL: 1213 Deadlock found 3. 재시도는 애플리케이션에서희생당한 트랜잭션이 롤백되어 처음부터 다시 시도해야 한다. |
Beta Was this translation helpful? Give feedback.
-
|
데드락이 발생했다고 해서 데이터베이스 전체가 멈추지는 않습니다. 데드락이 감지되면 DB는 보통 다음과 같이 처리합니다.
희생자 트랜잭션은 보통 비용이 적은 쪽이 선택됩니다. 데드락은 DB가 자동으로 감지하고 한쪽 트랜잭션을 롤백해 해결하지만, 애플리케이션에서는 해당 트랜잭션이 실패했다는 사실을 알고 적절히 처리해야 합니다. 따라서 어플리케이션은 다음과 같은 해결책이 필요합니다.
|
Beta Was this translation helpful? Give feedback.

Uh oh!
There was an error while loading. Please reload this page.
-
데드락이 감지되면 교착상태에 빠졌으니, 데이터베이스가 아예 멈출까요?
데이터베이스는 데드락을 어떻게 감지하고, 실제로 어떤 방식으로 처리하는지 서술해주세요.
Beta Was this translation helpful? Give feedback.
All reactions