У мене справді виникають проблеми з відстеженням блокування, яке ми відчуваємо.
Статус кореневого блокування SPID - "сплячий", cmd - "ЗАЧЕКАЮЧА КОМАНДА", і sqltext
є 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 для цієї збереженої процедури перераховувався часом, але НІКОЛИ перед тим, як БЛОК стався на блокуванні SPID. Здавалося, що, починаючи блокування, слід не записував його виконання (або будь-яке з заяв всередині нього). Однак є й інші часи, коли трасування записувало його виконання та блокування не сталося.
Збережений звіт про помилку процедури надходив від користувача, і я зміг знайти декілька операторів EXEC у слідах та запустити їх у SSMS. Ніколи, коли я запускав їх, у нас не було жодних блокувань або вони висіли. Вони пройшли так, як і очікувалося (блок вилову запустився та повернув транзакцію після помилки). Вирішивши виправлення збереженої процедури, ми знову не бачили проблеми.