Wie können wir überprüfen, welche Datenbanksperren auf welche Zeilen für einen Abfragebatch angewendet werden?
Gibt es ein Tool, das das Sperren auf Tabellenzeilenebene in Echtzeit hervorhebt?
DB: SQL Server 2005
quelle
Wie können wir überprüfen, welche Datenbanksperren auf welche Zeilen für einen Abfragebatch angewendet werden?
Gibt es ein Tool, das das Sperren auf Tabellenzeilenebene in Echtzeit hervorhebt?
DB: SQL Server 2005
Zum Hinzufügen zu den anderen Antworten sp_lock
können auch vollständige Sperrinformationen für alle ausgeführten Prozesse ausgegeben werden. Die Ausgabe kann überwältigend sein, aber wenn Sie genau wissen möchten, was gesperrt ist, ist es eine wertvolle Ausgabe. Normalerweise benutze ich es zusammen mit, sp_who2
um Probleme mit dem Sperren schnell zu lösen.
sp_lock
Abhängig von der jeweiligen Version von SQL Server stehen online mehrere verschiedene Versionen "freundlicherer" Verfahren zur Verfügung.
In Ihrem Fall ist SQL Server 2005 sp_lock
weiterhin verfügbar, jedoch veraltet. Daher wird jetzt empfohlen, die sys.dm_tran_locks
Ansicht für diese Art von Dingen zu verwenden. Ein Beispiel dafür, wie Sie Ihre eigene sp_lock-Funktion "rollen" können, finden Sie hier .
Dies zeigt Ihnen nicht genau, welche Zeilen gesperrt sind, aber dies kann für Sie hilfreich sein.
Sie können überprüfen, welche Anweisungen blockiert sind, indem Sie Folgendes ausführen:
select cmd,* from sys.sysprocesses
where blocked > 0
Außerdem erfahren Sie, worauf jeder Block wartet. Sie können dies also bis zum Ende verfolgen, um festzustellen, welche Anweisung den ersten Block verursacht hat, der die anderen Blöcke verursacht hat.
Bearbeiten , um einen Kommentar von @MikeBlandford hinzuzufügen :
Die blockierte Spalte zeigt die Geschwindigkeit des Blockierungsprozesses an. Sie können kill {spid} ausführen, um das Problem zu beheben.
Sie können aktuelle Sperren für Ihre Tabelle finden, indem Sie der Abfrage folgen.
Siehe sys.dm_tran_locks
Wenn mehrere Instanzen desselben request_owner_type vorhanden sind, wird die Spalte request_owner_id verwendet, um jede Instanz zu unterscheiden. Bei verteilten Transaktionen werden in den Spalten request_owner_type und request_owner_guid die verschiedenen Entitätsinformationen angezeigt .
Beispielsweise besitzt Sitzung S1 eine gemeinsame Sperre für Tabelle 1; und die Transaktion T1, die unter Sitzung S1 ausgeführt wird, besitzt auch eine gemeinsame Sperre für Tabelle 1. In diesem Fall wird die resource_description Spalte , die von zurückgegeben wird sys.dm_tran_locks wird zwei Instanzen derselben Ressource zeigen. In der Spalte request_owner_type wird eine Instanz als Sitzung und die andere als Transaktion angezeigt . Außerdem hat die Spalte resource_owner_id unterschiedliche Werte.
quelle
Ich verwende eine dynamische Verwaltungsansicht (DMV), um Sperren sowie die Objekt- oder Partitions-ID des gesperrten Elements zu erfassen.
(MUSS zu der Datenbank wechseln, die Sie beobachten möchten, um object_id zu erhalten.)
quelle
sp_who2
und in auf eine andere wartetsys.dm_os_waiting_task
(beide versuchen, dieselbe Tabelle zu aktualisieren). Ihre Anweisung gibt jedoch keine Zeilen zurück. Irgendwelche Ideen?Sie können auch die integrierte
sp_who2
gespeicherte Prozedur verwenden, um aktuelle blockierte und blockierende Prozesse auf einer SQL Server-Instanz abzurufen. Normalerweise führen Sie dies zusammen mit einer SQL Profiler-Instanz aus, um einen Blockierungsprozess zu finden und den neuesten Befehl anzuzeigen, den spid im Profiler ausgegeben hat.quelle
Details finden Sie über das folgende Skript.
quelle