sql >> Database >  >> RDS >> Sqlserver

UPDATE + MET (ROWLOCK) + CTE

NOLOCK is niet van toepassing op het deel van de query dat verwijst naar de tabel die moet worden gewijzigd. In SQL Server-update-instructies U-lock elke rij kort terwijl deze wordt getest. Dit is een mechanisme om een ​​impasse te vermijden. Het voorkomt meerdere updates voor elke S-lock een rij om te lezen en probeert deze vervolgens te X-locken.

U kunt de U-sloten niet AFAIK laten verdwijnen. Maar u kunt het aantal rijen U-locked tot het absolute minimum verminderen door zelf samen te voegen:

update t1
set ...
from T t1 with (rowlock)
where t1.ID in (select TOP 5 ID from T t2 with (nolock) where ... order by ...)

Dit voegt een beetje overhead toe, maar het stelt je in staat om NOLOCK . te gebruiken om te lezen.

Overweeg om snapshot-isolatie te gebruiken voor de leesbewerkingen. NOLOCK heeft bepaalde problemen, zoals het willekeurig afbreken van zoekopdrachten.




  1. Wat is er aan de hand met MySQL integer field matching string?

  2. Docker- django geeft fout tijdens verbinding met postgres:psycopg2.OperationalError:kan geen verbinding maken met server:verbinding geweigerd

  3. Middel om te UPDATE WAAR Waarde is IN Subquery die GROUP BY heeft, dus geen Race-Condition Issue (s)?

  4. Sorteer SQL-records op basis van overeenkomende voorwaarden