Rozetka UA

Продолжительная транзакция на сервере/ Longest Transaction Running TIME

Одним из характерных признаков нарушения нормальной работы сервера является наличие «залипшей» транзакции, которая исполняется очень долгое время. При нормальной работе транзакции выполняются максимум за сотни секунд, если транзакция висит час, сутки- верный признак проблемы.

 

Выявить наличие такой транзакции можно по счетчику, это легко. Но у меня очень долго не получалось вычислить саму транзакцию. Теперь мне это удалось, скрипт приложен

Microsoft SQL Server

— 20170320
— Dmitry Gorchilin www.digger.dp.ua

select * from sys.dm_os_performance_counters
WHERE counter_name LIKE ‘Longest Transaction Running TIME%’

— ==>

SELECT
session_id , elapsed_time_seconds as duration_seconds, *
FROM sys.dm_tran_active_snapshot_database_transactions
ORDER BY duration_seconds DESC;

— подробно с сессиями

SELECT
t.session_id,
t.elapsed_time_seconds as duration_seconds,
s.[host_name], s.program_name, s.login_name, s.nt_domain, s.nt_user_name,
s.cpu_time, s.memory_usage, s.total_elapsed_time, s.reads, s.writes,
s.logical_reads,s.transaction_isolation_level
FROM sys.dm_tran_active_snapshot_database_transactions t
INNER JOIN sys.dm_exec_sessions s ON t.session_id=s.session_id
WHERE t.elapsed_time_seconds>0
ORDER BY elapsed_time_seconds DESC;

— с расшифровкой уровня изоляции

SELECT
t.session_id,
t.elapsed_time_seconds as duration_seconds,
s.[host_name], s.program_name, s.login_name, s.nt_domain, s.nt_user_name,
s.cpu_time, s.memory_usage, s.total_elapsed_time, s.reads, s.writes,
s.logical_reads,
case when s.transaction_isolation_level=0 then ‘Unspecified’
when s.transaction_isolation_level=1 then ‘ReadUncomitted’
when s.transaction_isolation_level=2 then ‘ReadCommitted’
when s.transaction_isolation_level=3 then ‘Repeatable’
when s.transaction_isolation_level=4 then ‘Serializable’
when s.transaction_isolation_level=5 then ‘Snapshot’
ELSE ‘?’ END AS transaction_isolation_level
FROM sys.dm_tran_active_snapshot_database_transactions t
INNER JOIN sys.dm_exec_sessions s ON t.session_id=s.session_id
WHERE t.elapsed_time_seconds>0
ORDER BY elapsed_time_seconds DESC;

 

longest_transaction

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Pratik UaPratik UaPratik Ua