sql >> Database >  >> RDS >> Sqlserver

Verward over UPDLOCK, HOLDLOCK

Waarom zou UPDLOCK blokkeren selecteren? De Lock Compatibility Matrix toont duidelijk N voor de S/U en U/S stelling, zoals in Geen conflict .

Wat betreft de HOLDLOCK-hint staat in de documentatie:

HOLDLOCK:Is gelijk aan SERIALISEERBAAR. Zie SERIALIZABLE verderop in dit onderwerp voor meer informatie.

...

SERIALIZABLE:... De scan wordt uitgevoerd met dezelfde semantiek als een transactie die wordt uitgevoerd op het SERIALIZABLE isolatieniveau...

en het onderwerp Transactie-isolatieniveau legt uit wat SERIALIZABLE betekent:

Geen enkele andere transactie kan gegevens wijzigen die door de huidige transactie zijn gelezen totdat de huidige transactie is voltooid.

Andere transacties kunnen geen nieuwe rijen invoegen met sleutelwaarden die in het sleutelbereik zouden vallen dat door instructies in de huidige transactie wordt gelezen totdat de huidige transactie is voltooid.

Daarom wordt het gedrag dat u ziet perfect verklaard door de productdocumentatie:

  • UPDLOCK blokkeert gelijktijdige SELECT noch INSERT niet, maar blokkeert elke UPDATE of DELETE van de rijen geselecteerd door T1
  • HOLDLOCK betekent SERALISABLE en staat daarom SELECTEREN toe, maar blokkeert UPDATE en DELETES van de rijen geselecteerd door T1, ook als elke INSERT in het bereik geselecteerd door T1 (wat de hele tabel is, dus elke invoegen).
  • (UPDLOCK, HOLDLOCK):uw experiment laat niet zien wat naast het bovenstaande geval zou blokkeren, namelijk een andere transactie met UPDLOCK in T2 :
    SELECT * FROM dbo.Test WITH (UPDLOCK) WHERE ...
  • TABLOCKX geen uitleg nodig

De echte vraag is wat probeer je te bereiken ? Spelen met vergrendelingshints zonder een absoluut volledig 110% begrip van de vergrendelingssemantiek smeekt om problemen...

Na OP bewerken:

Ik wil rijen uit een tabel selecteren en voorkomen dat de gegevens in die tabel worden gewijzigd terwijl ik deze aan het verwerken ben.

U moet een van de hogere transactie-isolatieniveaus gebruiken. HERHAALBAAR LEZEN voorkomt dat de gegevens die u leest, worden gewijzigd. SERIALIZABLE voorkomt dat de gegevens die u leest worden gewijzigd en nieuwe gegevens worden niet ingevoegd. Het gebruik van transactie-isolatieniveaus is de juiste benadering, in tegenstelling tot het gebruik van queryhints. Kendra Little heeft een mooie poster met uitleg over de isolatieniveaus.



  1. Aanbevolen Intel-processors voor SQL Server 2014-workloads

  2. MariaDB uitvoeren in een hybride cloudconfiguratie

  3. XML-gegevens opslaan in SQL Server

  4. SQL Server SELECTEER LAATSTE N rijen