Wie führe ich eine Zeilensperre aus?

8

Ich möchte einen Datensatz sperren und dann darf niemand Änderungen an diesem Datensatz vornehmen. Wenn ich die Sperre loslasse, können die Leute die Aufzeichnung ändern.

In der Zwischenzeit, dass ein Datensatz gesperrt ist, möchte ich dem Benutzer eine Warnung anzeigen, dass der Datensatz gesperrt ist und dass Änderungen nicht zulässig sind.

Wie kann ich das tun?

Ich habe alle IsolationLevel-Level ausprobiert, aber keiner von ihnen hat das gewünschte Verhalten. Einige der Isolationsstufen warten, bis die Sperre aufgehoben wird, und nehmen dann eine Änderung vor. Ich möchte das nicht, da die Aktualisierung im Moment der Sperrung eines Datensatzes nicht erlaubt ist.

Was kann ich tun, um einen Datensatz zu sperren und alle Änderungen zu verwerfen?

Ich verwende SQL Server 2008

    
Martijn 22.09.2010, 07:58
quelle

4 Antworten

9

Unter der Annahme, dass dies ein MS SQL Server ist, möchten Sie wahrscheinlich UPDLOCK , möglicherweise kombiniert mit ROWLOCK ( Tabellenhinweise ). Ich habe Probleme, einen anständigen Artikel zu finden, der die Theorie beschreibt, aber hier ist ein kurzes Beispiel:

%Vor%

Diese Anweisung platziert eine Updatesperre in der Zeile für die Dauer der Transaktion (es ist also wichtig zu wissen, wann die Transaktion enden wird). Da Update-Sperren nicht mit exklusiven Sperren kompatibel sind (für die Aktualisierung von Datensätzen erforderlich), wird dies von niemandem verhindert Aktualisieren dieses Datensatzes, bis die Transaktion beendet ist.

Beachten Sie, dass andere Prozesse, die versuchen, diesen Datensatz zu ändern, blockiert werden, bis die Transaktion abgeschlossen ist. Sie werden jedoch mit der von Ihnen angeforderten Schreiboperation fortgesetzt, sobald die Transaktion beendet ist (es sei denn, sie haben ein Zeitlimit überschritten). Wenn Sie dies verhindern möchten, müssen Ihre anderen Prozesse zusätzliche Hinweise verwenden, um entweder einen Abbruch zu machen, wenn eine inkompatible Sperre erkannt wird, oder den Datensatz zu überspringen, wenn er sich geändert hat.

Auch Sie sollten diese Methode nicht verwenden, um Datensätze zu sperren, während Sie auf Benutzereingaben warten . Wenn dies Ihre Absicht ist, sollten Sie stattdessen eine Art Spalte "Wird geändert" zu Ihrer Tabelle hinzufügen.

Die SQL-Server-Sperrmechanismen sind eigentlich nur dazu geeignet, die Datenintegrität zu bewahren / Deadlocks zu verhindern - Transaktionen sollten generell so kurz wie möglich gehalten werden und sollten nicht auf Benutzereingaben warten.

    
Justin 22.09.2010 08:05
quelle
1

Sql Server hat Sperrhinweise, die jedoch auf den Umfang einer Abfrage beschränkt sind.

Wenn die Entscheidung zum Sperren des Datensatzes in einer Anwendung getroffen wird, können Sie dieselben Mechanismen wie das optimistische Sperren verwenden und Änderungen am Datensatz aus der Anwendung zurückweisen.

Verwenden Sie einen Zeitstempel oder eine GUID als Sperre für den Datensatz und verweigern Sie den Zugriff oder Änderungen am Datensatz, wenn der falsche Sperrschlüssel angegeben wird. Seien Sie vorsichtig, um die Aufzeichnungen wieder zu entsperren, oder Sie erhalten Waisen

    
stombeur 22.09.2010 08:04
quelle
0

Sehen Sie sich diese doppelte Frage zu SO an.

Grundsätzlich ist es:

%Vor%

Archiv

So etwas vielleicht?

%Vor%

Irgendwo im Update-Trigger:

%Vor%     
Denis Valeev 22.09.2010 08:03
quelle
0

Sie möchten nicht auf die Freigabe der Sperre warten und die Nachricht anzeigen, sobald Sie auf eine Sperre stoßen. Wenn dies der Fall ist, haben Sie NOWAIT versucht. Siehe Tabellenhinweise (Transact-SQL) und SQL Server 2008 Tabellentipps für weitere Details. Um von NOWAIT profitieren zu können, müssen Sie Datensätze für Änderungen sperren, google für weitere Details.

    
bjan 07.06.2012 10:57
quelle

Tags und Links