2016-06-28 4 views
1

C#에서 Microsoft SQL 서버 교착 상태 정보를보고하는 좋은 방법이 있습니까? 쿼리, 업데이트 등을 실행하는 C# 프로그램이 있습니다 ... 때때로 교착 상태 오류가 발생하지만 오류 메시지가 문제를 진단하는 데 특히 도움이되지 않습니다. 트랜잭션 (프로세스 ID 347)이 다른 리소스와 잠금 리소스에 교착 상태가되었습니다. 교착 상태 희생자로 선정되었습니다. 트랜잭션을 재실행하십시오.C# 교착 상태 정보

지금 당장 DBA를 추적하여 교착 상태 그래프를 얻기 위해 SQL 로그를 검색해야합니다. 이 정보를 체계적으로 얻을 수있는 방법이 있는지 궁금합니다.

+0

당신이 볼이 http://stackoverflow.com/questions/13159326/implementing-retry-logic-for-deadlock-exceptions – NinjaDeveloper

+0

뭔가를 시도 할 수 있습니다 : http://stackoverflow.com/questions/320636/how-to-get-efficient-sql-server-deadlock-handling-in-c-sharp와 함께 – Aby

답변

0

교착 상태 세부 정보는 클라이언트에 반환되지 않습니다. 최신 버전의 SQL Server에서 교착 상태 세부 정보를 프로그래밍 방식으로 가져 오는 방법 중 하나는 아래의 예제 쿼리와 같이 system_health 확장 이벤트 세션을 쿼리하는 것으로 특정 상황에 맞게 조정할 수 있습니다. 이 방법을 사용하려면 VIEW SERVER STATE 권한이 필요합니다. 그것이 당신에게 도움이된다면

--get deadlock_report from ring_buffer target 
SELECT 
     xed.value('@timestamp', 'datetime') as Creation_Date, 
     xed.query('.') AS Extend_Event 
FROM 
(
     SELECT CAST([target_data] AS XML) AS Target_Data 
     FROM sys.dm_xe_session_targets AS xt 
     INNER JOIN sys.dm_xe_sessions AS xs 
     ON xs.address = xt.event_session_address 
     WHERE xs.name = N'system_health' 
     AND xt.target_name = N'ring_buffer' 
) AS XML_Data 
CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData(xed) 
ORDER BY Creation_Date DESC; 
GO