IT 이야기/DB

[MSSQL] Lock 확인 및 Kill 하는 방법

하늘봉 2022. 9. 12. 12:00
반응형

DB를 사용하다보면 Lock이 발생하여 특정 테이블에 더이상 접근할 수 없는 현상이 발생합니다.

Lock에 대한 이론적 설명은 뒤로하고 우선 Lock을 확인하고 kill 하는 방법에 대해서 알아보겠습니다.

 

Lock 을 조회하는 시스템 프로시저 명령어를 다음과 같습니다.

EXEC SP_LOCK

 

아래와 같이 조회됩니다.

 

이제 의도적으로 Lock을 발생시켜 보겠습니다.

INSERT문을 수행하되 트랜잭션이 종료되지 않도록 합니다.

BEGIN TRAN
INSERT INTO dbo.CUST_TABLE(custid, custname, country) 
VALUES (8, 'test8', 'korea')

 

그리고 해당 테이블을 조회해 보겠습니다.

SELECT * FROM dbo.CUST_TABLE

 

그러면 쿼리가 계속 돌아가면서 결과 집합이 나오지 않습니다.

 

다시 SP_LOCK을 실행해 봅니다.

EXEC SP_LOCK

 

뭔가가 잔뜩 생겼습니다. 자세하게는 몰라도 X가 배타적 잠금을 의미하는 것을 우리는 알고 있습니다.

spid 59가 무엇인가 문제를 일으키고 있습니다.

 

SP_WHO 시스템 프로지서를 통해 해당 lock이 어떤 세션에서 걸린 것인지 확인할 수 있습니다.

EXEC SP_WHO 59 --(spid)

 

해당 세션의 loginname과 hostname을 확인할 수 있습니다.

 

또한 해당 spid의 이벤트 정보를 확인할 수도 있습니다.

dbcc inputbuffer (59) --spid

 

제가 의도적으로 발생시킨 Lock이라는 것이 확실하기에 이제는 해당 세션을 kill 해보도록 하겠습니다.

kill 59

 

성공적으로 kill 했다면 다시 sp_lock을 실행했을 때 잠금이 사라졌으며

해당 테이블에 접근이 자유로워졌을 것입니다.

 

 

반응형