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

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

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

Aus dem Dokument:

ROWLOCK Gibt an, dass Zeilensperren gesetzt werden, wenn Seiten- oder Tabellensperren normalerweise gesetzt werden. Wenn in Transaktionen angegeben wird, die auf der SNAPSHOT-Isolationsebene ausgeführt werden, werden Zeilensperren nicht verwendet, es sei denn, ROWLOCK wird mit anderen Tabellenhinweisen kombiniert, die Sperren erfordern, wie z. B. UPDLOCK und HOLDLOCK.

und

Sperrhinweise ROWLOCK, UPDLOCK und XLOCK, die Sperren auf Zeilenebene erwerben, können Sperren auf Indexschlüssel statt auf die eigentlichen Datenzeilen setzen. Wenn beispielsweise eine Tabelle einen Nonclustered-Index hat und eine SELECT-Anweisung, die einen Sperrhinweis verwendet, 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 erworben.

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

Es gibt auch das sehr ausführliche: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 Auslastung des Servers kann es zu einer Seitensperre eskalieren.