2010-01-15 6 views
4

저는 프로덕션에서 볼 수있는 다양한 교착 상태를 해결하려고 노력해 왔습니다. 교착 상태 추적을 사용하도록 설정했습니다. 흔적이 같은 키 잠금에 차단을 많이 보여SQL Server 2005에서 KEYLOCK 검사

내가 이해에서
01/15/2010 08:25:07,spid15s,Unknown,keylock hobtid=72057594047758336 dbid=2 
objectname=tempdb.dbo.MyTable indexname=IX_MyTable id=lock36977900 mode=X 
associatedObjectId=72057594047758336 

, 키 잠금이 삽입, 업데이트 또는 트랜잭션이 삽입, 업데이트 자체를 수행하는 동안 삭제되는 기록을 방지하기 위해 인덱스를 잠금, 삭제합니다.

잘못된 잠금을 요청하는 나쁜 쿼리 계획이 있다고 생각합니다. 내 develoment 시스템에서 동일한 쿼리를 실행하고 sp_lock을 실행하여 쿼리가 요구하는 잠금을 검사 할 수 있으며 목록에 일부 KEYLOCK이 표시됩니다. KEYLOCK이 잠그고있는 키의 범위는 어떻게 검사합니까?

답변

8

sp_lockresource에서의 값은 키의 해시 값이 고정되고있다.

첫 번째 2 바이트는 2 바이트의 키 값이고 다른 바이트는 hash 또는 값입니다. 행을 찾을 수

사용이 쿼리는 잠긴 : 문자열이 sp_lock에서 잠긴 자원의 값입니다

SELECT * 
FROM mytable 
WHERE %%LOCKRES%% = '{0000ABCDEFAB}' 

을.

이 쿼리가 두 행을 반환하면 테이블 크기가 커질수록 확률이 높아지면서 (생일 패러독스로 인해) 해시 충돌이 발생할 수 있습니다.

+2

단지 작은 메모. 이 방법은 클러스터 된 인덱스 또는 힙에만 적용됩니다. 만약 당신이 비 클러스터형 인덱스에 있다면, 다음과 같이 SELECT 힌트를 사용해야합니다. 'FROM myTable WITH (INDEX (myIndexName))' –

+1

MSSQL2014의 경우 약간 변경되었습니다. WHERE %% LOCKRES %% = ' (0000ABCDEFAB) ' –

2

이 링크는 어떻게하는지 설명합니다. 조금 오래되었으므로 여기서 잘라 붙여 넣지는 않을 것입니다.하지만 테스트하고 절할 기회가있을 때 개요를 게시하여 영원히 저장됩니다. KEY 자물쇠

Forum post on finding the row being key locked

관련 문제