Programming/MSSQL

MSSQL 데드락 그래프

장형이 2023. 2. 3. 00:15

MSSQL에서 데드락 그래프를 뽑는 방법을 기록한다.

 

1. SSMS를 이미 설치해 놨다면, 아마도 깔려 있을 SQL Server Profiler 18을 실행한다.

 

2. [파일] -> [새 추적]을 누른다.

3. 접속 정보를 확인하고 연결 한다.

 

4. [이벤트 선택] -> [Locks] -> [Deadlock graph]를 체크한 다음 [실행]을 누른다.

 

5. 아래와 같이 창이 떴다면 이제 데드락을 일으켜 보자.

 

-- 테스트 테이블 세팅
CREATE TABLE Test1 
(
    uid      BIGINT,
    item1   Varchar(10),
    item2   Varchar(10),
    item3   Varchar(10),
    CONSTRAINT PK_TEST1 PRIMARY KEY (uid)
)
GO

INSERT INTO dbo.Test1 VALUES (1, '1', '1', '1')
INSERT INTO dbo.Test1 VALUES (2, '1', '1', '1')

먼저 위와 같은 쿼리로 테스트 테이블을 만들어 데이터들을 세팅한다.

 

-- 1번 프로세스
BEGIN TRAN
UPDATE dbo.Test1 SET item1 = '1' WHERE uid = 1
WAITFOR DELAY '0:0:3'
UPDATE dbo.Test1 SET item1 = '1' WHERE uid = 2
COMMIT TRAN
-- 2번 프로세스
BEGIN TRAN
UPDATE dbo.Test1 SET item1 = '1' WHERE uid = 2
WAITFOR DELAY '0:0:3'
UPDATE dbo.Test1 SET item1 = '1' WHERE uid = 1
COMMIT TRAN

이후 2개의 프로세스에서 동시에 데드락 유발 쿼리를 실행시킨다.

 

6. 아래와 같이 그래프가 나오고 어떤 쿼리에서 발생했는지 확인이 가능하다.

 

7. 우클릭을 하여 파일로 뽑을 수 있다. 이 파일을 SSMS로 실행시키면 그래프를 다시 그려 볼 수 있고, 텍스트 에디터로 보면 좀 더 자세하게 볼 수 도 있다.

 

데드락 그래프 외에도 데드락을 분석할 때 Lock:Acquired, Lock:Released와 같은 유용한 이벤트들이 있으니 MSSQL로 개발을 한다면 필히 알아야 할 것 같다.