SQL Server/SQL Server 자주보는

[MSSQL] 오랫동안 활성화 되어 있는 트랜잭션 확인하는 방법

꽁담 2020. 2. 28. 19:15

오랫동안 활성화 되어있는 트랜잭션이 있는 경우 문제점


트랜잭션이 오랫동안 수행되고 있는 경우, 이후에 같은 페이지를 접근하는 다른 세션들은 대기해야 합니다.

이런 경우 트랜잭션을 수행하는 세션을 정리해야 이후의 세션들이 작업을 진행할 수 있습니다.


또한 트랜잭션이 활성화 되어 있다면, 트랜잭션 로그도 정리할 수 없어 사용량이 계속 늘어나게 됩니다.



다양한 원인(락, 네트워크 등)으로 트랜잭션을 정상종료하지 못하고 남아있는 좀비세션들이 있을 수 있습니다.


오랫동안 수행되는 트랜잭션을 찾는 쿼리


오랫동안 수행되는 트랜잭션의 세션ID, 현재 상태, 접속계정, 접속 hostname, 수행된 시간, 쿼리를 확인할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
  p.spid
  , p.cmd
  , p.status
  , p.loginame
, p.hostname
  , p.open_tran
  , datediff(s, p.last_batch, getdate()) as [wait tims(s)]
  , q.text
FROM
  master.dbo.sysprocesses AS p WITH(NOLOCK)
  CROSS APPLY sys.dm_exec_sql_text (p.sql_handle) AS q
WHERE
  p.open_tran > 0
  AND p.spid > 50
  AND EXISTS ( SELECT 1 FROM master.dbo.syslockinfo WHERE req_spid = p.spid and rsc_type <> 2 )
ORDER BY datediff(s, p.last_batch, getdate()) DESC
cs


이렇게 찾은 세션ID 는 KILL 명령어로 강제종료시킬 수 있습니다.

1
KILL 51
cs