Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie führt man eine Zeilensperre durch?

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

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

Diese Anweisung setzt eine Aktualisierungssperre in der Zeile für die Dauer der Transaktion (daher ist es wichtig zu wissen, wann die Transaktion endet). Da Update-Sperren inkompatibel mit exklusiven Sperren sind (erforderlich, um Datensätze zu aktualisieren), dies 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 haben eine Zeitüberschreitung oder sind als festgefahrener Prozess beendet). Wenn Sie dies verhindern möchten, müssen Ihre anderen Prozesse zusätzliche Hinweise verwenden, um entweder abzubrechen, wenn eine inkompatible Sperre erkannt wird, oder um den Datensatz zu überspringen, wenn er sich geändert hat.

Sie sollten diese Methode auch nicht verwenden, um Datensätze zu sperren, während Sie auf Benutzereingaben warten . Wenn Sie dies beabsichtigen, sollten Sie Ihrer Tabelle stattdessen eine Art "wird geändert"-Spalte hinzufügen.

Die Sperrmechanismen des SQL-Servers sind eigentlich nur zur Wahrung der Datenintegrität / Vermeidung von Deadlocks geeignet - Transaktionen sollten generell so kurz wie möglich gehalten werden und sollte auf keinen Fall gewartet werden, während auf Benutzereingaben gewartet wird.