web-dev-qa-db-ger.com

Ist es möglich, das Sperren auf Zeilenebene in SQL Server zu erzwingen?

Ich kann sehen, wie das Sperren auf Zeilen- und Seitenebene in SQL Server deaktiviert wird, aber ich kann keine Möglichkeit finden, SQL Server zu zwingen, das Sperren auf Zeilenebene zu verwenden. Gibt es eine Möglichkeit, SQL Server zu zwingen, das Sperren auf Zeilenebene und NICHT das Sperren auf Seitenebene zu verwenden?

54
Elan

Sie können den ROWLOCK-Hinweis verwenden, AFAIK SQL kann jedoch entscheiden, ihn zu eskalieren, wenn die Ressourcen knapp werden

Aus der Dokumentation :

ROWLOCK Gibt an, dass Zeilensperren verwendet werden, wenn normalerweise Seiten- oder Tabellensperren verwendet werden. Bei der Angabe in Transaktionen, die auf der SNAPSHOT-Isolationsstufe ausgeführt werden, werden Zeilensperren nur verwendet, wenn ROWLOCK mit anderen Tabellenhinweisen kombiniert wird, für die Sperren erforderlich sind, z. B. UPDLOCK und HOLDLOCK.

und

Sperrhinweise ROWLOCK, UPDLOCK UND XLOCK, die Sperren auf Zeilenebene erhalten, setzen möglicherweise Sperren für Indexschlüssel und nicht für die eigentlichen Datenzeilen. Wenn beispielsweise eine Tabelle einen nicht gruppierten Index hat und eine SELECT-Anweisung mit einem Sperrhinweis von einem abdeckenden Index behandelt wird, wird eine Sperre für den Indexschlüssel im abdeckenden Index und nicht für die Datenzeile in der Basistabelle erteilt.

nd schließlich Dies gibt eine ziemlich ausführliche Erklärung zur Sperreneskalation in SQL Server 2005, die in SQL Server 2008 geändert wurde.

Es gibt auch die sehr ausführlichen: Locking in The Database Engine (in Büchern online)

Also im Allgemeinen

UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93

Sollte in Ordnung sein, aber abhängig von den Indizes und der Last auf dem Server kann es zu einer Seitensperre kommen.

32
Sam Saffron

Verwenden Sie die ALLOW_PAGE_LOCKS-Klausel von ALTER/CREATE INDEX :

ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
14
Remus Rusanu

Sie können den Optimierer nicht wirklich dazu zwingen, etwas zu tun, aber Sie können ihn anleiten.

UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93

Siehe - Steuern von SQL Server mit Sperren und Hinweisen

8
mdma