2009-04-13 8 views
1

Ich habe Code geschrieben, um eine SQL Server-Datenbank zu aktualisieren. Bevor ich die Datenbank aktualisieren, erreichen ich eine exklusive Sperre über:Test vor dem Versuch, eine exklusive Sperre zu aktivieren

ALTER DATABASE Test SET SINGLE_USER WITH NO_WAIT 

Allerdings würde ich die Datenbank testen gerne zu sehen, wenn die exklusive Sperre ist möglich vor ich den obigen Code ausführen. Der Test muss nicht zu 100% perfekt sein, ich möchte nur die Möglichkeit einer Zeitüberschreitung vermeiden, wenn ich versuche, eine exklusive Sperre zu erhalten.

Zu diesem Zweck habe ich den Code unten geschrieben:

SELECT 
    * 
FROM 
    sys.db_tran_locks 
WHERE 
    resource_database_id = DB_ID('Test') AND 
    request_session_id <> @@SPID 

Ich gehe davon aus, dass, wenn es 1 oder mehr Zeile zurückgegeben, dann muss die Datenbank im Einsatz sein. Ist das wahr? Oder ist es nicht so einfach?

UPDATE Taking @ gbn Kommentare zu berücksichtigen, habe ich beschlossen, Rollbacks bestehender Verbindungen zu zwingen, die folgende Anweisung:

ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

Bevor Sie diesen Code ausgeführt wird, werde ich dem Benutzer die Gelegenheit geben, abmelden Ich möchte jedoch, dass der Benutzer die Liste der aktiven Verbindungen zur Datenbank sehen kann, damit er eine fundierte Entscheidung treffen kann. Was mich zu dieser Frage führt.

Antwort

2

Hauptsächlich ist ein DB-Lock nur um zu zeigen, dass es in Verwendung ist. Datenbanken haben im Vergleich zu Code-/Tabellenobjekten nicht wirklich viele exklusive Sperrsituationen.

Einzelbenutzermodus ist keine Sperre, aber die Anzahl der zulässigen Verbindungen.

Ich würde die ALTER DATABASE in einem TRY/CATCH-Block umbrechen, da es keine Garantie gibt, dass der Status zwischen Überprüfung und ALTER DB nicht geändert wird.

Allerdings könnte ich falsch liegen oder die Frage falsch verstehen ... so müssen Sie auch für den exklusiven Sperrmodus auf der Datenbankressource in der obigen Abfrage testen. Ihr Code oben zeigt Ihnen jede Sperre, die jemand mit einem leeren Abfrage-Fenster geöffnet in SSMS ...

bearbeiten, auf Kommentar basiert sein könnte

Sie erkennen können, wer es durch diese verwendet:

  • sys.dm_exec_connection s
  • sys.dm_exec_sessions
  • sys.dm_exec_requests

Um ehrlich zu sein, ist es schwierig, die automatische Statistikaktualisierung zu stoppen oder ein Benutzer, der die einzelne Verbindung nimmt. Normalerweise würden Sie das, was alle anderen Benutzer trennt und nicht warten zu stören ...

+0

In diesem Fall versuche ich festzustellen, ob ich die Datenbank auf eine Verbindung reduzieren kann. Gibt es eine Möglichkeit, den aktuellen Satz von Verbindungen abzufragen? – Mitkins

0

Was passiert, wenn die Datenbank ab dem Zeitpunkt, zu dem Sie festgestellt haben, dass sie nicht verwendet wurde, beschäftigt ist, bis zu dem Punkt, an dem Sie versuchen, die exklusive Sperre zu erhalten?

+0

Es gibt natürlich nichts, um dies zu stoppen. Ein Teil des Upgrade-Prozesses besteht jedoch darin, dass Benutzer Verbindungen zur Datenbank eliminieren. Hoffentlich ist es also wahrscheinlicher, dass die Datenbank nicht ausgelastet ist. – Mitkins

Verwandte Themen