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.
Antworten:
Aus Kommentaren geht hervor, dass Sie ein clientseitiges Zeitlimit für Befehle hatten, durch das die SQL-Abfrage abgebrochen wurde. Dadurch wird die Transaktion nicht zurückgesetzt, da die Verbindung auf SQL Server aufgrund von Verbindungspooling geöffnet bleibt.
Sie müssen also SET XACT_ABORT ON verwenden oder einen Client-Rollback-Code hinzufügen
Unter SQL Server-Transaktionszeitlimit finden Sie alle wichtigen Details
quelle
Verwenden Sie das most_recent_sql_handle in sys.dm_exec_connections, um die zuletzt ausgeführte Anweisung anzuzeigen.
Überprüfen Sie auch, ob für diese Spid offene Transaktionen vorhanden sind
quelle
DBCC INPUTBUFFER(spid)
, um die zuletzt ausgeführte SQL anzuzeigen.Haben Sie versucht, Adam Machanics sp_whoisactive zu verwenden ? Es gibt eine Option, mit der der äußere Befehl überprüft werden kann, ob er tatsächlich in einem Proc enthalten ist. Möglicherweise hält die Anwendung eine Transaktion offen, anstatt sie festzuschreiben. Schauen Sie sich auch DBCC OPENTRAN an.
quelle