2012-06-27 4 views
3

어떻게 이것이 가능한지 이해해야합니다. 즉,이 메커니즘을 이해하고 싶습니다.교착 상태 해석 및 수정

enter image description here enter image description here

피해자 프로세스는 큰 조합 형태의 쿼리가 바로 여러 문장으로 구성된 삽입/업데이트 배치입니다에 약 6 테이블 (엔티티 프레임 워크)

과정을 포함한다.

교착 상태 이벤트에서 잘린 이후로 SQL을 제공 할 수 없습니다.

2/3 테이블과 쓰기 작업과 관련된 교착 상태가 발생했으나이를 해석 할 수는 없습니다. 무슨 일이 일어난거야? 나는 색인이 관련되어있는 것을 본다. 이것은 유효한 색인이다. 나는 그것을 필요로한다.

내가 분당 약 100 같은 선택하여 두 번째

<deadlock-list> 
<deadlock victim="process2fdc4e088"> 
    <process-list> 
    <process id="process2fdc4e088" taskpriority="0" logused="0" waitresource="KEY: 28:72057594054049792 (7303a0672d4e)" waittime="713" ownerId="928827354" transactionname="user_transaction" lasttranstarted="2012-06-27T06:32:35.030" XDES="0x9982e3b0" lockMode="S" schedulerid="3" kpid="15300" status="suspended" spid="84" sbid="2" ecid="0" priority="0" trancount="1" lastbatchstarted="2012-06-27T06:32:35.137" lastbatchcompleted="2012-06-27T06:32:35.030" clientapp="sss" hostname="aaa" hostpid="4080" loginname="aaa" isolationlevel="read committed (2)" xactid="928827354" currentdb="28" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> 
    <executionStack> 
    <frame procname="adhoc" line="1" sqlhandle="0x020000009b2fc809e2d580f750aacd7697bcc9fab8b85647"> 
SELECT 
[UnionAll2].[C3] AS [C1], 
[UnionAll2].[C4] AS [C2], 
[UnionAll2].[C5] AS [C3], 
[UnionAll2].[C6] AS [C4], 
[UnionAll2].[C7] AS [C5], 
[UnionAll2].[C8] AS [C6], 
[UnionAll2].[C9] AS [C7], 
[UnionAll2].[C10] AS [C8], 
[UnionAll2].[C11] AS [C9], 
[UnionAll2].[C12] AS [C10], 
[UnionAll2].[C13] AS [C11], 
[UnionAll2].[C14] AS [C12], 
[UnionAll2].[C15] AS [C13], 
[UnionAll2].[C16] AS [C14], 
[UnionAll2].[C17] AS [C15], 
[UnionAll2].[C18] AS [C16], 
[UnionAll2].[C19] AS [C17], 
[UnionAll2].[C20] AS [C18], 
[UnionAll2].[C21] AS [C19], 
[UnionAll2].[C22] AS [C20], 
[UnionAll2].[C23] AS [C21], 
[UnionAll2].[C24] AS [C22], 
[UnionAll2].[C25] AS [C23], 
[UnionAll2].[C1] AS [C24], 
[UnionAll2].[C26] AS [C25], 
[UnionAll2].[C27] AS [C26], 
[UnionAll2].[C28] AS [C27], 
[UnionAll2].[C29] AS [C28], 
[UnionAll2].[C30] AS [C29], 
[UnionAll2].[C31] AS [C30], 
[UnionAll2].[C32] AS [C31], 
[UnionAll2].[C33] AS [C32], 
[UnionAll2].[C34] AS [C33], 
[UnionAll2].[C35] AS [C34], 
[UnionAll2].  </frame> 
    </executionStack> 
    <inputbuf> 
SELECT 
[UnionAll2].[C3] AS [C1], 
[UnionAll2].[C4] AS [C2], 
[UnionAll2].[C5] AS [C3], 
[UnionAll2].[C6] AS [C4], 
[UnionAll2].[C7] AS [C5], 
[UnionAll2].[C8] AS [C6], 
[UnionAll2].[C9] AS [C7], 
[UnionAll2].[C10] AS [C8], 
[UnionAll2].[C11] AS [C9], 
[UnionAll2].[C12] AS [C10], 
[UnionAll2].[C13] AS [C11], 
[UnionAll2].[C14] AS [C12], 
[UnionAll2].[C15] AS [C13], 
[UnionAll2].[C16] AS [C14], 
[UnionAll2].[C17] AS [C15], 
[UnionAll2].[C18] AS [C16], 
[UnionAll2].[C19] AS [C17], 
[UnionAll2].[C20] AS [C18], 
[UnionAll2].[C21] AS [C19], 
[UnionAll2].[C22] AS [C20], 
[UnionAll2].[C23] AS [C21], 
[UnionAll2].[C24] AS [C22], 
[UnionAll2].[C25] AS [C23], 
[UnionAll2].[C1] AS [C24], 
[UnionAll2].[C26] AS [C25], 
[UnionAll2].[C27] AS [C26], 
[UnionAll2].[C28] AS [C27], 
[UnionAll2].[C29] AS [C28], 
[UnionAll2].[C30] AS [C29], 
[UnionAll2].[C31] AS [C30], 
[UnionAll2].[C32] AS [C31], 
[UnionAll2].[C33] AS [C32], 
[UnionAll2].[C34] AS [C33], 
[UnionAll2].[C35] AS [C34], 
[UnionAll2] </inputbuf> 
    </process> 
    <process id="processd5471948" taskpriority="0" logused="1204" waitresource="PAGE: 28:1:102676" waittime="864" ownerId="928827514" transactionname="user_transaction" lasttranstarted="2012-06-27T06:32:35.363" XDES="0x1e0f0d3f0" lockMode="IX" schedulerid="4" kpid="19116" status="suspended" spid="77" sbid="2" ecid="0" priority="0" trancount="2" lastbatchstarted="2012-06-27T06:32:35.377" lastbatchcompleted="2012-06-27T06:32:35.377" clientapp="DitatTMS" hostname="sss" hostpid="4080" loginname="sss" isolationlevel="read committed (2)" xactid="928827514" currentdb="28" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> 
    <executionStack> 
    <frame procname="adhoc" line="1" stmtstart="50" stmtend="250" sqlhandle="0x020000003859c72d14e4f731cc12f95e6e3ed8b75668b3b9"> 
update [dbo].[MBLTripStopAttribute] 
set [AttributeValue] = @0 
where ([TripStopAttributeKey] = @1)  </frame> 
    <frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000"> 
unknown  </frame> 
    </executionStack> 
    <inputbuf> 
(@0 varchar(max) ,@1 int)update [dbo].[MBLTripStopAttribute] 
set [AttributeValue] = @0 
where ([TripStopAttributeKey] = @1) 
select [RowVersion] 
from [dbo].[MBLTripStopAttribute] 
where @@ROWCOUNT &gt; 0 and [TripStopAttributeKey] = @1 </inputbuf> 
    </process> 
    </process-list> 
    <resource-list> 
    <keylock hobtid="72057594054049792" dbid="28" objectname="DitatApp.dbo.MBLTripDriver" indexname="IX_MBLTripDriver_UpdatedOn_DriverKey" id="lock873ee900" mode="X" associatedObjectId="72057594054049792"> 
    <owner-list> 
    <owner id="processd5471948" mode="X"/> 
    </owner-list> 
    <waiter-list> 
    <waiter id="process2fdc4e088" mode="S" requestType="wait"/> 
    </waiter-list> 
    </keylock> 
    <pagelock fileid="1" pageid="102676" dbid="28" objectname="DitatApp.dbo.MBLTripStopAttribute" id="lock92d2c200" mode="SIU" associatedObjectId="72057594055163904"> 
    <owner-list> 
    <owner id="process2fdc4e088" mode="S"/> 
    </owner-list> 
    <waiter-list> 
    <waiter id="processd5471948" mode="IX" requestType="convert"/> 
    </waiter-list> 
    </pagelock> 
    </resource-list> 
</deadlock> 
</deadlock-list> 
+0

이미지가 잘 렸습니까? 옆에서 화살이 들어오는 것을 봅니다. – Andomar

+0

교착 상태 소스 XML을 사용하십시오. [이미지가 종종 모호합니다.] (http://rusanu.com/2010/05/12/the-puzzle-of-u-locks-in-deadlock-graphs/) –

+0

@Andomar 2에서 이미지가 손상되었습니다. 너무 작았습니다. 시각적으로 병합 된 상단과 하단의 왼쪽과 오른쪽 - 중간 부분은 – katit

답변

0

당 약 1 등의 삽입 공정 (84)처럼 보이는 시스템에 어쩌면 일주일에 3 번이 교착 상태를 얻을 공유 의도 업데이트 pagelock A를 보유하고 . 그것은 B.

의 공유 키 잠금을 기다리고

프로세스 (77)는 그것은

다음 단계는 SQL 문이 검색됩니다 A.에 의도 전용 페이지 잠금을 기다리고 B.에 전용 키 잠금을 보유 프로세스가 실행 중입니다.

+0

으로 공유 할 수 있습니다. 왼쪽에 대한 쿼리는 거의 표시되지만 오른쪽 쿼리는 삽입 수만큼 "설명"됩니다./해당 트랜잭션의 업데이트는 다양합니다. 더 나은 진단에 도움이 될까요? 마찬가지로 나는 XML이 도움이되지 않는다고 말했다. 크고 잘린 쿼리. – katit

+0

@katit : 현재 쿼리뿐 아니라 해당 트랜잭션의 일부인 모든 쿼리가 필요하다. 일주일에 세 번 발생하면 [추적 플래그 3604 다음에 1204를 사용하도록 설정할 수 있습니다.] (http://www.sqlservercentral.com/articles/Performance+Tuning/tracingdeadlocks/1324/) – Andomar