sql >> Database >  >> RDS >> Sqlserver

Is het mogelijk om vergrendeling op rijniveau in SQL Server te forceren?

U kunt de ROWLOCK-hint gebruiken, maar AFAIK SQL kan besluiten deze te laten escaleren als de resources bijna op zijn

Van de dokter:

ROWLOCK Specificeert dat rijvergrendelingen worden genomen wanneer pagina- of tabelvergrendelingen gewoonlijk worden genomen. Bij gespecificeerde intransacties die werken op het SNAPSHOT-isolatieniveau, worden rijvergrendelingen niet uitgevoerd, tenzij ROWLOCK wordt gecombineerd met andere tabelhints waarvoor vergrendelingen vereist zijn, zoals UPDLOCK en HOLDLOCK.

en

Vergrendeltips ROWLOCK, UPDLOCK EN XLOCK die vergrendelingen op rijniveau verkrijgen, kunnen vergrendelingen op indexsleutels plaatsen in plaats van op de daadwerkelijke gegevensrijen. Als atable bijvoorbeeld een niet-geclusterde index heeft en een SELECT-instructie met een vergrendelingshint wordt afgehandeld door een afdekindex, dan wordt een slot verkregen op de indexsleutel in de afdekkende index in plaats van op de gegevensrij in de basistabel.

En tot slot geeft dit een behoorlijk diepgaande uitleg over lock-escalatie in SQL Server 2005 die in SQL Server 2008 is gewijzigd.

Er is ook het zeer diepgaande:Locking in The Database Engine (in boeken online)

Dus in het algemeen

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

Zou goed moeten zijn, maar afhankelijk van de indexen en de belasting van de server kan het escaleren tot een paginavergrendeling.



  1. IRI-software verbinden met Oracle

  2. wat is het probleem met AttachDbFilename

  3. Architectuur en afstemming van geheugen in PostgreSQL-databases

  4. Blob in Oracle-database invoegen met C#