Ich habe wirklich Probleme beim Aufspüren von Blockierungen.
Der SPID-Status für die Root-Blockierung lautet 'Sleeping', der cmd lautet 'AWAITING COMMAND' und der sqltext
ist SET TRANSACTION ISOLATION LEVEL READ COMMITTED
.
Wenn ich den Bericht Top Transactions by Blocked Transactions Count anzeige, lautet die Blocking SQL-Anweisung '-'.
Ich habe eine Ablaufverfolgung für SQL durchgeführt und wenn die Blockierung auftritt, die SPID für die Root-Blockierung verfolgt, aber es hat mich nicht wirklich weitergebracht. Die letzte trace-Anweisung ist dieselbe wie sqltext
oben SET TRANSACTION ISOLATION LEVEL READ COMMITTED
.
Ich habe alle zugehörigen gespeicherten Prozeduren überprüft, um sicherzustellen, dass sie TRY / CATCH BEGIN TRAN / COMMIT TRAN / ROLLBACK TRAN-Anweisungen haben (wir verwenden gespeicherte Prozeduren für alles, damit keine eigenständigen Anweisungen ausgeführt werden). Dieses Problem ist in den letzten 24 Stunden aufgetreten und niemand behauptet, Änderungen am System vorgenommen zu haben.
Lösung: Eine unserer selten verwendeten gespeicherten Prozeduren hatte einen Fehler mit einer Einfügung (Anzahl der Spalten stimmte nicht überein), aber wir sind immer noch verwirrt darüber, was genau passiert ist.
Bei der Betrachtung aller Ablaufverfolgungsinformationen wurde die EXEC-Anweisung für diese gespeicherte Prozedur zu bestimmten Zeiten aufgelistet, jedoch NIEMALS, bevor der BLOCK auf der blockierenden SPID auftrat. Es schien, dass der Trace zu Beginn der Blockierung nicht die Ausführung (oder eine der darin enthaltenen Anweisungen) aufzeichnete. Es gibt jedoch auch andere Zeiten, in denen der Trace die Ausführung aufgezeichnet hat und keine Blockierung aufgetreten ist.
Der Fehlerbericht für gespeicherte Prozeduren stammte von einem Benutzer, und ich konnte mehrere EXEC-Anweisungen in Ablaufverfolgungen finden und in SSMS ausführen. Zu keinem Zeitpunkt, als ich sie rannte, traten Blockierungen auf oder hingen sie. Sie wurden wie erwartet ausgeführt (der catch-Block hat die Transaktion nach dem Fehler ausgelöst und zurückgesetzt). Nach dem Beheben der gespeicherten Prozedur ist das Problem nicht mehr aufgetreten.