여러 행을 하나로 결합하는 SQL Server 2014 데이터베이스에 연결된 응용 프로그램이 있습니다. 응용 프로그램이 실행 중일 때이 데이터베이스에는 다른 연결이 없습니다.SQL Server의 교착 상태 방지
먼저 특정 시간 범위 내의 행을 선택하십시오. 이 쿼리는 클러스터 된 조회와 병합 된 클러스터되지 않은 검색 (TIME 열)을 사용합니다.
select ...
from FOO
where TIME >= @from and TIME < @to and ...
다음, 우리는 C#에서 이러한 행을 처리하고 하나의 갱신 및 다중 삭제 등의 변경을 쓰기,이 덩어리마다 여러 번 발생합니다. 또한 클러스터되지 않은 인덱스 검색을 사용합니다.
begin tran
update FOO set ...
where NON_CLUSTERED_ID = @id
delete FOO where NON_CLUSTERED_ID in (@id1, @id2, @id3, ...)
commit
여러 병렬 덩어리로 이것을 실행할 때 교착 상태가 발생합니다. 나는 update
과 delete
에 대해 ROWLOCK
을 사용해 보았습니다.하지만 청크 사이에 겹침이 없더라도 어떤 이유로 든 이전보다 훨씬 많은 교착 상태가 발생했습니다.
update
에서 TABLOCKX, HOLDLOCK
을 시도했지만 병렬 처리의 이점을 잃어 버리므로 내 select
을 병렬로 수행 할 수 없음을 의미합니다.
어떻게하면 교착 상태를 피할 수 있지만 여러 개의 병렬 청크를 처리 할 수 있습니까?
select
에 NOLOCK
을 사용하는 것이 안전할까요? 청크 사이에 행이 중복되지 않는다면이 경우 어떻게해야합니까? 그런 다음 TABLOCKX, HOLDLOCK
은 update
과 delete
만을 차단합니까?
아니면 그냥 교착 상태가 발생하여 응용 프로그램에서 쿼리를 다시 시도해도된다는 것을 받아 들여야합니까?
UPDATE (추가 정보) : 모든 교착 상태가 지금까지 update
및 delete
단계에서 일어난는 select
없음. 오늘 해결할 수 없다면 교착 상태 로그를 얻으려고 노력할 것입니다 (올바른 추적 플래그는 이전에 활성화되지 않았습니다).
UPDATE :이 ROWLOCK
발생하는 교착 상태의이 개 배치되어, 그들은 모두 만 delete
문과가 사용하는 클러스터되지 않은 인덱스를 참조하십시오. 테이블의 힌트없이 발생하는 교착 상태와 동일한 것인지 확실하지 않습니다. 이러한 힌트 중 일부는 재현 할 수 없었습니다.
그렇지 않으면 .xdl에서 필요한 것도이 있는지 물어
, 나는 전체를 부착 조금 피곤 해요.
선택 중에 'UPDLOCK'을 (를) 주장 했습니까? 이렇게하면 교착 상태에서 벗어나도록 업데이트/삭제할 때 잠금이 이미 있습니다. 가능한 경우 교착 상태 로깅 세부 정보를 공유하십시오. – Jens
모든 처리를 저장 프로 시저로 옮길 수 있습니까? 또한 스냅 샷 격리를 켜기 만하면 해결할 수 있지만 실제로 수행중인 작업에 따라 다릅니다. –
@Jens 불행히도 지금 당장 교착 상태 로그를 가져올 수 없습니다. 교착 상태로 인해 실패한 모든 스레드가'update' 및'delete' 단계에있는 것으로 보이므로'select' 잠금을 변경하면이 경우에 영향을 미치지 않습니다. 교착 상태 로그를 얻지 못했습니다. 다음 시도를 위해 교착 상태 추적 플래그를 사용할 수 있는지 확인할 것입니다. @ Nick.McDermaid 불행히도 스냅 샷 격리를 사용할 수 없습니다. –