sql >> Databáze >  >> RDS >> Sqlserver

Je možné vynutit zamykání na úrovni řádků v SQL Server?

Můžete použít nápovědu ROWLOCK, ale AFAIK SQL se může rozhodnout ji eskalovat, pokud mu docházejí prostředky

Z doco:

ROWLOCK Určuje, že zámky řádků jsou přijímány, když jsou zámky stránky nebo tabulky běžně přijímány. Při specifikovaných transakcích fungujících na úrovni SNAPSHOTisolation se zámky řádků neprovedou, pokud není ROWLOCK kombinován s jinými tabulkovými radami, které vyžadují zámky, jako je UPDLOCK a HOLDLOCK.

a

Rady pro zámek ROWLOCK, UPDLOCK a XLOCK, které získávají zámky na úrovni řádků, mohou umístit zámky na klíče indexu spíše než na řádky skutečných dat. Pokud má například atable index bez klastrů a příkaz SELECT používající nápovědu k zámku je zpracován krycím indexem, zámek se získá na klíči indexu v krycím indexu, nikoli na řádku dat v základní tabulce.

A nakonec to poskytuje docela podrobné vysvětlení eskalace zámků v SQL Server 2005, která byla změněna v SQL Server 2008.

Je zde také velmi do hloubky:Zamykání v databázovém stroji (v knihách online)

Takže obecně

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

Mělo by to být v pořádku, ale v závislosti na indexech a zatížení serveru to může skončit eskalací až k uzamčení stránky.



  1. Odečtěte roky od data v SQLite

  2. Jak naplnit kalendářní tabulku v Oracle?

  3. Maximalizace účinnosti databázového dotazu pro MySQL – část druhá

  4. Vraťte n-tý záznam z dotazu MySQL