Ist es möglich, Sperren auf Zeilenebene in SQL Server zu erzwingen?
-
29-09-2019 - |
Frage
kann ich sehen, wie Zeilenebene und Seitenebene deaktivieren in SQL Server blockiert, aber ich kann nicht einen Weg zu zwingen, SQL Server zu verwenden Sperren auf Zeilenebene finden. Gibt es eine Möglichkeit SQL Server Sperr Verwendung Zeilenebene zu zwingen und NICHT Seite Sperren verwenden?
Lösung
Sie können die ROWLOCK Hinweis verwenden, aber AFAIK SQL entscheiden, kann es zu eskalieren, wenn es nicht genügend Ressourcen läuft
Vom doco :
ROWLOCK Gibt an, dass Zeilensperren sind wenn Seiten- oder Tabellensperren genommen sind gewöhnlich genommen. Wenn angegeben in Transaktionen im SNAPSHOT Betrieb Isolationsstufe, sind Zeilensperren nicht genommen, es sei denn ROWLOCK mit kombiniert wird andere Tabellenhinweise, die Sperren erfordern, wie UPDLOCK und HOLDLOCK.
und
Sperrhinweise ROWLOCK, UPDLOCK UND XLOCK dass acquire Zeilensperren kann statt Sperren für Indexschlüssel und nicht der tatsächliche Datenzeilen. Wenn zum Beispiel ein Tabelle hat einen nicht gruppierten Index und eine SELECT-Anweisung einen Sperrhinweis verwenden ist durch einen abdeckenden Index behandelt, ist eine Sperre auf dem Indexschlüssel erworben in der abdeckenden Index und nicht auf den Daten Zeile in der Basistabelle.
Und schließlich das gibt ein ziemlich in die Tiefe gehende Erklärung über Sperreneskalation in SQL Server 2005, die in SQL Server 2008.
geändert wurdeEs gibt auch die sehr in die Tiefe: Sperren in der Datenbank-Engine (in Büchern online)
Also, im allgemeinen
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
Sollte in Ordnung sein, aber je nach dem Indizes und Last auf dem Server kann es zu einer Seitensperre eskaliert enden.
Andere Tipps
Verwenden Sie die ALLOW_PAGE_LOCKS Klausel von ALTER / CREATE INDEX :
ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
Sie können nicht wirklich das Optimierungsprogramm zwingen, etwas zu tun, aber man kann es führen.
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93