У меня действительно есть проблемы с отслеживанием некоторых блокировок, которые мы испытываем.
Статус SPID корневого блокирующего - «спящий», cmd - «AWAITING COMMAND» и « sqltext
is» SET TRANSACTION ISOLATION LEVEL READ COMMITTED
.
Когда я просматриваю отчет «Количество транзакций по количеству заблокированных транзакций», оператор блокирующего SQL имеет вид «-».
Я выполнил трассировку SQL и, когда происходит блокировка, отслеживает корневой блокирующий SPID, но это ни к чему меня не привело. Последний оператор трассировки такой же, как указано sqltext
выше SET TRANSACTION ISOLATION LEVEL READ COMMITTED
.
Я проверил все связанные хранимые процедуры, которые я могу найти, чтобы убедиться, что они имеют операторы TRY / CATCH BEGIN TRAN / COMMIT TRAN / ROLLBACK TRAN (мы используем хранимые процедуры для всего, поэтому не выполняются отдельные операторы). Эта проблема только начала возникать в течение последних 24 часов, и никто не утверждает, что внес какие-либо изменения в систему.
Решение: одна из наших редко используемых хранимых процедур имела ошибку со вставкой (количество столбцов не совпадало), но мы все еще не уверены в том, что именно происходит.
При просмотре всей информации о трассировке оператор EXEC для этой хранимой процедуры иногда показывался, но НИКОГДА непосредственно перед тем, как BLOCK происходил с блокирующим SPID. Казалось, что когда он начал блокировать, трассировка не записывала его выполнение (или какие-либо операторы внутри него). Однако бывают случаи, когда трассировка записывала свое выполнение, и блокировка не происходила.
Отчет об ошибке хранимой процедуры был получен от пользователя, и я смог найти несколько операторов EXEC в трассировках и запустить их в SSMS. Ни разу, когда я запускал их, у нас не было никаких блокировок или они зависали. Они работали как ожидалось (блок catch сработал и откатил транзакцию после ошибки). После исправления хранимой процедуры мы больше не видели проблему.