2017-05-15 21 views
0

저는 SQL Server DBA로서 초보자입니다. 적어도 한 번 Merge 문을 사용하는 SQL Server 2012 서버에서 교착 상태 문제가 발생했습니다. 병합 문에는 NOLOCK, UPDLOCK, HOLDLOCK과 같은 절이 사용되지 않았습니다. BizTalk이 XML을 읽고 SQL Server에 데이터를 저장하는 다중 사용자 환경입니다.SQL 서버 교착 상태 - 수정 필요

분당 BizTalk는 300 xml 메시지를 읽습니다. 프로덕션 서버가 있기 때문에 연구를하지 않고서는 아무 것도 구현할 수 없지만이 문제를 해결하는 방법에 대해서는 알지 못했습니다. 최근에 두 xml 메시지가 테이블의 데이터를 업데이트하려고 시도하고 동일한 인덱스를 사용하려고 시도하면서 오류가 발생했습니다. 누구든지이 문제를 해결하는 방법을 알려줄 수 있습니까?

+0

재현 가능한 케이스를 얻을 수 있다면 SQL Trace를 재생하면서 모든 'deadlock'이벤트를 추적하십시오. 이렇게하면 어떤 SQL이 교착 상태에 있는지, 정확히 어떤 자원에 대한 정보를 얻을 수 있습니다. 교착 상태는 거의 항상 하나의 스레드가 자원 A 다음에 B로 이어지는 결과이며, 다른 스레드는 B, A 뒤에옵니다. 때로는 교착 상태를 제거하기 위해 색인을 추가하거나 제거 할 수 있지만, 동일한 시간에 항상 자원을 확보하려면 코드를 수정해야하는 경우가 있습니다 주문. – pmbAustin

+0

나는 교착 상태 추적을 가져 와서 문제가 어디에 있는지 이해했다. 그러나 교착 상태는 항상 발생하지만 병합 성명서에서 자주 결정을 내리는 데 혼란을줍니다. – aprasy

+0

교착 상태 그래프에는 교착 상태가되는 정확한 항목 (예 : 특정 색인을 식별 할 개체 ID)이 표시되어야합니다. 그것이 당신이 시작할 필요가있는 곳입니다. 매우 큰 ID가 있으며이 SQL을 사용하여 참조하는 내용을 정확히 디코딩 할 수 있습니다. SELECT hobt_id, object_name (p. [object_id]), index_id FROM sys.partitions p WHERE hobt_id = 72057594060734464 - 특정 자물쇠 ID – pmbAustin

답변

0

MERGE의 스캔 단계는 MERGE를 실행하는 단일 세션의 경우와 SELECT를 실행하는 동시 세션의 경우에 최적화 된 공유 잠금 (S)으로 수행됩니다. 여러 개의 동시 MERGE 문의 경우 교착 상태 나 실패로 이어질 수 있습니다.

해결 방법은 대상 테이블에 HOLDLOCK 힌트를 추가해야합니다. 이것은 SELECT에서 UPDLOCK을 사용하는 다른 read-for-update 패턴과 약간 일치하지 않습니다.