2008-09-21 6 views
7

Gibt es eine Möglichkeit, eine Zeile in der SQL 2005-2008-Datenbank zu sperren, ohne eine Transaktion zu starten, sodass andere Prozesse die Zeile nicht aktualisieren können, bis sie entsperrt ist?Sperrzeile in SQL 2005-2008

Antwort

3

können Sie RowLock or other hints verwenden, aber Sie sollten careful ..

Der HOLDLOCK Hinweis SQL Server sein wird anweisen, um die Sperre zu halten, bis die Transaktion übermittelt. Der ROWLOCK-Hinweis sperrt nur diesen Datensatz und gibt keine Seiten- oder Tabellensperre aus.

Das Schloss wird auch freigegeben, wenn Sie Ihre Verbindung schließen oder es Timeout. Ich würde sehr vorsichtig dabei sein, da es alle SELECT-Anweisungen stoppt, die diese Zeile tot in ihren Spuren schlagen. SQL Server verfügt über zahlreiche Sperrhinweise, die Sie verwenden können. Sie können sie in der Onlinedokumentation anzeigen, wenn Sie nach HOLDLOCK oder ROWLOCK suchen.

+0

Ich habe das versucht, aber es ist nicht das, was ich will. Es hält tatsächlich die Sperre, wenn ich ein Update mache. Das Update wartet, bis die Sperre aufgehoben wird, und aktualisiert danach den Datensatz (das ist nicht das, was ich möchte). Zweitens kann ich immer noch eine Auswahl ohne Probleme durchführen. – Martijn

1

Alles, was Sie auf dem Server ausführen, geschieht in einer Transaktion, entweder implizit oder explizit.

Sie können nicht einfach eine Zeile ohne Transaktion sperren (die Zeile nur lesen). Sie können die Datenbank nur lesen, aber nicht nur eine Zeile.

Erklären Sie Ihren Zweck und es könnte eine bessere Lösung sein. Isolationsstufen und Sperrhinweise und row versioning.

0

Müssen Sie eine Zeile sperren, oder sollte Sql Server's Application locks tun, was Sie brauchen?

Ein Application Locks ist nur ein Schloss mit einem Namen, den Sie "sperren" können, "entsperren" und prüfen, ob es gesperrt ist. Details siehe oben. (Sie werden entsperrt, wenn Ihre Verbindung geschlossen usw., so neigen dazu, sich selbst zu reinigen)

+0

Ich kann keine Anwendungssperren verwenden, weil andere Anwendungen, die auf die 'gesperrte' Zeile zugreifen, nicht wissen, dass sie zuerst die Anwendungssperrung überprüfen müssen. – alex