반응형
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을 실행했을 때 잠금이 사라졌으며
해당 테이블에 접근이 자유로워졌을 것입니다.
반응형
'IT 이야기 > DB' 카테고리의 다른 글
[SQLP 시험대비 요약/단답형] 선택도와 카디널리티 (1) | 2022.09.15 |
---|---|
[MSSQL] 문자열 자르기 (SUBSTRING, RIGHT, LEFT) (0) | 2022.09.13 |
[SQLP 시험대비 요약/단답형] 공유커서, 세션커서, 애플리케이션 커서 (0) | 2022.09.11 |
[SQLP 시험대비 요약/단답형] 소프트 파싱과 하드 파싱 (2) | 2022.09.10 |
[DB 기술면접] 해시 조인(Hash Join)이란 무엇인가 (1) | 2022.09.09 |