10 Stimmen

Wie führt man eine Zeilensperre durch?

Ich möchte einen Datensatz sperren, so dass niemand mehr Änderungen an diesem Datensatz vornehmen kann. Wenn ich die Sperre aufhebe, können andere Personen den Datensatz ändern.

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

Wie kann ich das tun?

Ich habe alle IsolationLevel-Stufen ausprobiert, aber keine von ihnen hat das gewünschte Verhalten. Einige der Isolationsebenen warten, bis die Sperre aufgehoben wird, und nehmen dann eine Änderung vor. Das möchte ich nicht, da eine Aktualisierung in dem Moment, in dem ein Datensatz gesperrt ist, nicht zulässig ist.

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

Ich verwende SQL Server 2008

11voto

Justin Punkte 82143

Wenn Sie davon ausgehen, dass es sich um einen MS SQL-Server handelt, möchten Sie wahrscheinlich UPDLOCK möglicherweise kombiniert mit ROWLOCK ( Hinweise zur Tabelle ). Ich habe Schwierigkeiten, einen guten Artikel zu finden, der die Theorie beschreibt, aber hier ist ein schnelles Beispiel:

SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1 

Mit dieser Anweisung wird ein Update-Sperre auf die Zeile für die Dauer der Transaktion (daher ist es wichtig zu wissen, wann die Transaktion endet). Da Aktualisierungssperren unvereinbar mit exklusiven Schlössern (für die Aktualisierung von Datensätzen erforderlich), so wird verhindert, dass jemand diesen Datensatz aktualisiert, bis die Transaktion beendet ist.

Beachten Sie, dass andere Prozesse, die versuchen, diesen Datensatz zu ändern, blockiert werden, bis die Transaktion abgeschlossen ist, jedoch mit dem von ihnen angeforderten Schreibvorgang fortfahren, sobald die Transaktion beendet ist (es sei denn, sie werden durch Zeitüberschreitung oder als blockierter Prozess beendet). Wenn Sie dies verhindern wollen, müssen Ihre anderen Prozesse zusätzliche Hinweise verwenden, um entweder abzubrechen, wenn eine inkompatible Sperre festgestellt 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" in Ihre Tabelle aufnehmen.

Die Sperrmechanismen des SQL-Servers eignen sich eigentlich nur zur Wahrung der Datenintegrität bzw. zur Vermeidung von Deadlocks - Transaktionen sollten generell so kurz wie möglich und sollte auf keinen Fall beibehalten werden, während man auf Benutzereingaben wartet.

1voto

stombeur Punkte 2682

Sql Server verfügt über Locking Hints, die jedoch auf den Bereich einer Abfrage beschränkt sind.

Wenn die Entscheidung, den Datensatz zu sperren, in einer Anwendung getroffen wird, können Sie die gleichen Mechanismen wie beim optimistischen Sperren verwenden und alle Änderungen am Datensatz aus der Anwendung heraus verweigern.

Verwenden Sie einen Zeitstempel oder eine Guid als Sperre für den Datensatz und verweigern Sie den Zugriff auf den Datensatz oder Änderungen daran, wenn der falsche Sperrschlüssel angegeben wird. Achten Sie darauf, Datensätze wieder zu entsperren, sonst erhalten Sie Waisen

0voto

Denis Valeev Punkte 5885

Siehe dies doppelte Frage auf SO.

Im Grunde ist es das:

begin tran

select * from [table] with(holdlock,rowlock) where id = @id

--Here goes your stuff

commit tran

Archiv

Vielleicht so etwas wie das hier?

update t 
set t.IsLocked = 1 
from [table] t 
where t.id = @id

Irgendwo in der Aktualisierungsauslösung:

if exists (
select top 1 1 
from deleted d 
join inserted i on i.id = d.id
where d.IsLocked = 1 and i.RowVersion <> d.RowVersion)
begin
print 'Row is locked'
rollback tran
end

0voto

bjan Punkte 1920

Sie wollen nicht warten, bis die Sperre aufgehoben wird, und die Meldung anzeigen, sobald Sie auf eine Sperre stoßen, wenn dies der Fall ist, haben Sie versucht NOWAIT . Siehe Tabellen-Hinweise (Transact-SQL) y SQL Server 2008-Tabellen-Hinweise für weitere Einzelheiten. Um in den Genuss zu kommen von NOWAIT Sie müssen Datensätze bei Bearbeitungen sperren, googeln Sie nach weiteren Details.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X