Wie führen Sie eine Zeilen-Sperre?
Möchte ich sperren einen Datensatz und dann darf niemand änderungen an dem Datensatz vorzunehmen. Wenn ich die Sperre lösen, dann werden die Menschen möglicherweise ändern Sie den Datensatz.
In der Zwischenzeit, dass ein Datensatz gesperrt ist, ich möchte, dass der Nutzer eine Warnung, dass der Datensatz gesperrt ist und dass änderungen nicht zulässig sind.
Wie kann ich dies tun?
Habe ich versucht, alle IsolationLevel-Ebenen, aber keiner von Ihnen hat das Verhalten, das ich will. Einige der Isolation-levels warten, bis die Sperre freigegeben ist und dann eine änderung vornehmen. Ich will das nicht, weil die Aktualisierung ist nicht erlaubt in dem moment ein Datensatz gesperrt ist.
Was kann ich tun, einen Datensatz zu sperren und zu leugnen, alle änderungen?
Ich benutze SQL Server 2008
- Es hängt von der Datenbank. Welche?
- SQL Server 2008
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit der Annahme, dass dies ein MS SQL-server, werden Sie wahrscheinlich wollen
UPDLOCK
, eventuell kombiniert mitROWLOCK
(Tabelle Hinweise). Ich habe Schwierigkeiten, einen anständigen Artikel beschreibt die Theorie, aber hier ist schnelles Beispiel:Diese Aussage wird in einem update sperren auf der Reihe für die Dauer der Transaktion, (so ist es wichtig zu wissen, Wann die Transaktion wird Ende). Als update-sperren sind nicht kompatibel mit exklusiven locks (erforderlich zum aktualisieren von Datensätzen), dies wird verhindern, dass jemand von der Aktualisierung dieses Datensatzes, bis die Transaktion beendet ist.
Beachten Sie, dass andere Prozesse versuchen, Sie zum ändern dieser Datensatz gesperrt, bis die Transaktion abgeschlossen ist, wird jedoch weiter mit was auch immer schreiben-operation, die Sie angefordert, sobald die Transaktion beendet wurde (es sei denn, Sie sind timed out oder getötet als einen Deadlock-Prozess). Wenn Sie verhindern möchten, dass diese dann Ihre anderen Prozesse verwenden müssen, zusätzliche Hinweise, um entweder Abbrechen, wenn eine inkompatible Sperre erkannt wird, oder überspringen Sie den Datensatz, wenn Sie sich geändert hat.
Auch, sollten Sie nicht verwenden diese Methode zum sperren von Datensätzen, während das warten auf eine Benutzereingabe. Wenn dies Ihre Absicht, dann sollten Sie eine Art des "seins" geändert am " Spalte der Tabelle statt.
SQL server locking-Mechanismen sind eigentlich nur geeignet für den Einsatz zur Erhaltung der Datenintegrität /Verhütung von deadlocks - Transaktionen sollten allgemein gehalten werden so kurz wie möglich und sollte sicherlich nicht aufrechterhalten werden, während das warten auf eine Benutzereingabe.
NOWAIT
Hinweis, die bewirkt, dass Sie, um zurückzukehren, sobald eine Sperre Auftritt, anstatt zu warten, für den timeout.SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1
?Sql Server sperren-Hinweise, aber diese sind begrenzt auf den Umfang einer Abfrage.
Wenn die Entscheidung zur Sperre der Datensatz in einer Anwendung, die Sie verwenden können, die gleichen Mechanismen wie das optimistische sperren und verweigern jegliche änderungen an den Datensatz aus der Anwendung.
Verwenden Sie einen Zeitstempel oder eine guid als eine Sperre auf den Datensatz und die Verweigerung des Zugangs oder änderungen am Datensatz, wenn das falsche-Verriegelung-Schlüssel gegeben ist. Seien Sie vorsichtig, um zu entsperren Datensätze wieder, oder Sie bekommen Waisen
Sehen diese doppelte Frage auf SO.
Im Grunde ist es das:
Archiv
Etwas wie das vielleicht?
Irgendwo in der update-trigger:
Wollen Sie nicht warten, bis die Sperre aufgehoben wird, und zeigen Sie die Nachricht, sobald Sie auch eine Sperre, wenn dies der Fall ist, dann haben Sie versucht
NOWAIT
. Sehen Tabellenhinweise (Transact-SQL) und SQL Server 2008-Tabelle-Hinweise für mehr details. Zu erhalten, nutzenNOWAIT
Sie müssen zum sperren von Datensätzen auf Bearbeitungen, google für weitere details.