이 쿼리로 교착 상태가 발생하는 이유는 무엇입니까?
UPDATE TOP(1) system_Queue SET
[StatusID] = 2,
@ID = InternalID
WHERE InternalID IN (
SELECT TOP 1
InternalID FROM system_Queue
WHERE IsOutGoing = @IsOutGoing AND StatusID = 1
ORDER BY MessageID ASC, InternalID ASC)
교착 상태 그래프 추가 :
<keylock hobtid="72057594236436480" dbid="9" objectname="Z.dbo.system_Queue" indexname="PK_system_Queue" id="lock5b25cc80" mode="X" associatedObjectId="72057594236436480">
<owner-list>
<owner id="processc6fe40" mode="X"/>
</owner-list>
<waiter-list>
<waiter id="processc7b8e8" mode="S" requestType="wait"/>
</waiter-list>
</keylock>
<keylock hobtid="72057594405453824" dbid="9" objectname="Z.dbo.system_Queue" indexname="IX_system_Queue_DirectionByStatus" id="lock48cf3180" mode="S" associatedObjectId="72057594405453824">
<owner-list>
<owner id="processc7b8e8" mode="S"/>
</owner-list>
<waiter-list>
<waiter id="processc6fe40" mode="X" requestType="wait"/>
</waiter-list>
</keylock>
추가 :
이러한 유형의 교착 상태를 피하는 방법이있는 기사에 대해 Sankar 에게 감사합니다 .
- 독자의 예측에서 불필요한 열을 제거하여 클러스터형 인덱스를 찾을 필요가 없습니다.
- 비 클러스터형 인덱스에 필수 열을 포함 된 열로 추가하여 인덱스를 덮어서 독자가 클러스터형 인덱스를 찾지 못하도록 다시
- 비 클러스터형 인덱스를 유지해야하는 업데이트 방지
어떤 DB 플랫폼의 어떤 버전을 사용하고 있습니까? 기본 trx 격리 (또는 동시성) 수준은 무엇입니까? 현재 system_Queue 테이블에 어떤 인덱스가 있습니까?
—
SQLRockstar
교착 상태 그래프의 @SQLRockstar 부분 추가, SQL Server 2008
—
garik
IsOutGoing 및 StatusID에 의한 @SQLRockstar IX_system_Queue_DirectionByStatus 인덱스
—
garik