Search

2015년 12월 8일 화요일

[Database] [MSSQL] 데이터베이스 내에 걸린 Lock 확인하기.

* Lock이 걸린 세션과 테이블을 알아보자.

EXEC sp_lock


* 여기에서 나온 spid는 세션이고, ObjId는 다시 한 번 아래처럼 조회하여 구체적으로 락이 걸린 곳의 이름을 확인해볼 수 있다.

SELECT * FROM sys.objects WHERE object_id = '0000000000'
-- 0000000000에 ObjId의 숫자를 입력.


* 동시 다발적으로 락이 걸려서, 그 수를 파악해보기 위해서는 아래와 같은 쿼리를 이용한다.
* 여기에서 나온 request_mode에 대한 값은 아래의 사이트를 참고하자.
* http://www.lockergnome.com/uncategorized/2010/01/26/what-are-the-different-lock-modes-in-sql-server/

SELECT request_mode, COUNT(request_mode)
FROM sys.dm_tran_locks
GROUP BY request_mode

* LOCK에 대한 세부적인 내역(락이 발생한 테이블, 접속정보 등)을 확인하려면, 아래의 쿼리를 이용한다. 아래 사이트의 쿼리를 참조해서 수정했다.
http://www.sqlservercentral.com/Forums/Topic1166444-391-1.aspx

SELECT l.resource_type, l.request_mode,
    CASE
        WHEN l.resource_type IN ('DATABASE', 'FILE', 'METADATA')
            THEN l.resource_type
        WHEN l.resource_type = 'OBJECT'
            THEN OBJECT_NAME(l.resource_associated_entity_id)
        WHEN l.resource_type IN ('KEY', 'PAGE', 'RID')
            THEN (SELECT  OBJECT_NAME(object_id)
                  FROM    sys.partitions
                  WHERE   sys.partitions.hobt_id = l.resource_associated_entity_id
                  )
        ELSE 'Unidentified'
    END Parent_Object,
    l.request_session_id, s.host_name, s.login_name
FROM sys.dm_tran_locks l
    LEFT OUTER JOIN sys.dm_exec_sessions s
        ON l.request_session_id = s.session_id
ORDER BY resource_type, request_mode, Parent_Object


* LOCK을 강제로 종료하기 위해서는 KILL과 세션ID(spid)를 사용한다.

KILL 00
-- 00에 spid의 숫자를 입력.

댓글 없음:

댓글 쓰기