Database/MS-SQL

[스크랩] Lock 확인, 조치방법

99iberty 2022. 7. 18. 23:38

https://sagittariusof85s.tistory.com/124

 

[MS-SQL]락(LOCK)관리하기

DB를 사용하다보면 떨어질 수 없는 것이 LOCK 관리입니다. DB를 쓸 때 자주 발생하는 것이 LOCK이며, 최소한으로 발생되고 최대한 빠르게 처리가 되도록 해야 하는 것이 LOCK입니다. 그래서 이번에는

sagittariusof85s.tistory.com

 

DB를 사용하다보면

떨어질 수 없는 것이 LOCK 관리입니다.

DB를 쓸 때 자주 발생하는 것이

LOCK이며,

최소한으로 발생되고

최대한 빠르게 처리가 되도록 해야 하는 것이

LOCK입니다.

 

그래서 이번에는 LOCK 을 

확인하고

조치하는 방법에 대해서 정리를 해보고자 합니다.

 

 

1. LOCK 확인하기

SQL SERVER에서는

락을 확인 하는 방법이

여러가지가 있습니다.

 

그 중 제가 아는 것은 3가지 방법이 있어서

그 3가지 방법에 대해

모두 정리를 해보고자 합니다.

 

1-1. SP_LOCK

MS-SQL에서 제공하는

시스템 프로시저가 있습니다.

이를 이용해서 확인할 수 있습니다.

함수는 SP_LOCK입니다.

 

사용방법은 다음과 같습니다.

EXEC SP_LOCK;

위처럼 작성하여

돌리면 됩니다.

그러면 결과는 다음과 같습니다.

 

 

그러면 Mode값이 

X인 SPID가 있다면

해당 세션이 락 걸린 세션입니다.

 

 

1-2. SP_WHO2

또한, SQL SERVRVER에서 제공하는

또 다른 시스템프로시저가 있습니다.

SP_WHO2 입니다.

위 프로시저를 이용해서도 

LOCK이 걸린 정보를 확인할 수 있습니다.

 

쿼리는 다음과 같습니다.

EXEC SP_WHO2;

위처럼 돌리면 결과는 다음과 같습니다.

 

 

위처럼 결과가 나옵니다.

이 곳에서 BlkBy 컬럼에 값이 있으면

Lock을 걸고 있는

프로세스의 spid값입니다.

 

1-3. SYS.sysprocesses

내부 시스템 테이블을 이용해서도

확인할 수 있습니다.

테이블은 SYS.sysprocesses 입니다.

 

쿼리는 다음과 같습니다.

SELECT * FROM SYS.sysprocesses WHERE blocked > 0;

위처럼 쿼리를 작성하여 돌리면 되십니다.

그러면 결과는 다음과 같습니다.

 

 

blocked에 값이 있으면

락이 걸린 것입니다.

 

저는 테스트서버이고,

그렇다보니 락 걸린 것이 없어서

안나오네요.

 

 

 

2. 쿼리 확인

해당 프로세스의 쿼리를

확인해 보는 것이 좋습니다.

정확하게 무슨 쿼리에서 락이 걸린 것인지 알 수 있고,

추후 튜닝을 통해

락이 안걸릴 수 있도록

조치할 수도 있으니

확인이 필요합니다.

 

확인 방법은 다음과 같습니다.

dbcc inputbuffer ( 75 );

위처럼 쿼리를 작성하여 돌리면 되십니다.

그러면 결과는 다음과 같습니다.

 

저는 테스트로 

락 걸리지 않은 다른 프로세스의

spid값을 넣었습니다.

그래도 저렇게 쿼리가 나오는 것을 확인할 수 있습니다.

이렇게 쿼리 정보를 확인해놓는 것이

좋습니다.

 

 

3. kill

이제 종료를 시켜야 합니다.

종료 시키는 것은 매우 간단합니다.

방법은 다음과 같습니다.

kill SPID

위처럼 하면 됩니다.

그러면 해당 세션이 종료가 됩니다.

 

 

 

DB를 사용하면서

락은 떨어질래야 떨어질 수는 없습니다.

다만, 최소한으로 발생하도록 하여

DB의 성능을 높여주는 것이 중요합니다.