In de veronderstelling dat dit een MS SQL-server is, wilt u waarschijnlijk UPDLOCK
, eventueel gecombineerd met ROWLOCK
(Tabelhints
). Ik heb problemen met het vinden van een fatsoenlijk artikel dat de theorie beschrijft, maar hier is een snel voorbeeld:
SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1
Deze verklaring plaatst een updatevergrendeling op de rij voor de duur van de transactie (het is dus belangrijk om te weten wanneer de transactie zal eindigen). Omdat updatevergrendelingen incompatibel zijn met exclusieve vergrendelingen (vereist om records bij te werken), dit voorkomt dat iemand dit record bijwerkt totdat de transactie is beëindigd.
Houd er rekening mee dat andere processen die proberen dit record te wijzigen, worden geblokkeerd totdat de transactie is voltooid, maar zullen doorgaan met de schrijfbewerking die ze hebben aangevraagd zodra de transactie is beëindigd (tenzij ze een time-out krijgen of worden stopgezet als een vastgelopen proces). Als u dit wilt voorkomen, moeten uw andere processen aanvullende hints gebruiken om ofwel af te breken als een incompatibele vergrendeling wordt gedetecteerd, of de record over te slaan als deze is gewijzigd.
U mag deze methode ook niet gebruiken om records te vergrendelen terwijl u wacht op gebruikersinvoer . Als dit uw bedoeling is, moet u in plaats daarvan een soort "wordt gewijzigd"-kolom aan uw tabel toevoegen.
De vergrendelingsmechanismen van de SQL-server zijn eigenlijk alleen geschikt om de gegevensintegriteit te behouden / deadlocks te voorkomen - transacties moeten over het algemeen zo kort mogelijk worden gehouden en mag zeker niet worden onderhouden tijdens het wachten op gebruikersinvoer.