Что может вызвать блокировку сервера sql: отмена
Я делаю SQL Server Profiler на тупики, потому что пользователи получают тайм-ауты запросов. В профилировщике столбец eventClass показывает Lock:Escalation и Lock:Cancel. Как узнать, что может привести к отмене запроса? По сути, одни и те же запросы выполняются кучей пользователей, и все меняется в течение дня, но время от времени пользователи отключаются. Я тоже запускаю sqldiag; однако, к сожалению, я не администратор и не пытаюсь разобраться в проблеме. Какие-либо предложения?
ник сообщества спасибо
1 ответ
Тайм-ауты запросов и взаимоблокировки в значительной степени взаимоисключающие.
Ситуация взаимоблокировки будет очень быстро обнаружена фоновым потоком монитора взаимоблокировки и будет обрабатываться таким образом, что один из заблокированных процессов (обычно процесс с более низкой стоимостью отката) будет выбран в качестве жертвы взаимоблокировки, и он будет работать до определенного момента. откат.
Тайм-аут запроса может происходить с живыми блокировками, когда большое количество активных процессов пытается получить доступ к одному и тому же ресурсу и, таким образом, блокировать друг друга. Когда истекшее время превысит значение тайм-аута (установленное клиентом), запрос будет отменен (и по этой причине вы видите события Lock:Cancelled в трассировке).
Очень важно, чтобы клиент справился с этим условием, потому что все ресурсы, полученные в транзакции, для которой истек тайм-аут, останутся занятыми до тех пор, пока соединение активно, или транзакция не откатывается.
Для диагностики блокирующих ситуаций вы можете сделать несколько вещей.
Если вы наблюдаете за тем, когда процесс заблокирован, выполните следующий запрос, чтобы узнать заголовок цепочки блокировок, чтобы можно было продолжить расследование:
select r.session_id, r.host_name, r.program_name,
r.login_name, r.nt_domain, r.nt_user_name,
r.total_elapsed_time/1000 as total_elapsed_time_sec, getdate() as vrijeme,
(select text from sys.dm_exec_sql_text(c.most_recent_sql_handle)) as sql_text
from sys.dm_exec_connections c
inner join sys.dm_exec_sessions r on r.session_id = c.session_id
where r.is_user_process = 1
and exists (
select *
from sys.dm_os_waiting_tasks r2
where r2.blocking_session_id = r.session_id
)
and not exists (
select *
from sys.dm_os_waiting_tasks r3
where r3.session_id = r.session_id
)
and r.total_elapsed_time/1000 > 10
Этот запрос имеет порог 10 секунд.
Более того, вы можете использовать Profiler для захвата события процесса блокировки, а затем проанализировать его позже. Проверьте эту ссылку для подробного объяснения:
https://www.simple-talk.com/sql/sql-tools/how-to-identify-blocking-problems-with-sql-profiler/
Обычно будет несколько запросов, ответственных за большую часть блокировок. Определите их и попытайтесь оптимизировать (переписать, проиндексировать...). Кроме того, вы можете настроить уровень изоляции зафиксированных моментальных снимков для базы данных, чтобы читатели не ожидали записи.