이 쿼리로 교착 상태가 발생하는 이유는 무엇입니까?


11

이 쿼리로 교착 상태가 발생하는 이유는 무엇입니까?

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

답변:


13

같은 문과 같은 테이블에서 SELECT와 UPDATE를 수행하는 것처럼 보입니다.

SELECT는 IX_system_Queue_DirectionByStatus 색인 내부의 값에 대해 공유 잠금을 보유하고 있으며 UPDATE는 기본 잠금을 업데이트하는 독점 잠금을 얻기 전에 잠금을 해제해야합니다. IX_system_Queue_DirectionByStatus 키 값).

어쨌든,이 쿼리는 선택하고 업데이트하는 인덱스 값이 충돌하지 않는 드문 경우에만 성공할 것입니다. 실행할 때마다 교착 상태입니까 (그렇다고 가정합니다).

교착 상태를보다 자세히 설명하는 링크는 다음과 같습니다. http://sqlblog.com/blogs/jonathan_kehayias/archive/2008/07/30/the-anatomy-of-a-deadlock.aspx


빙고! 감사합니다. 내가 본 교착 상태는 정말 이상한 상황이었습니다. 답변 주셔서 감사합니다.
garik

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.