U beschrijft in feite een klassieke workflow op basis van wachtrijen en u zou moeten overwegen om een echte te gebruiken wachtrij .
Ter wille van de discussie, hier is hoe u bereikt wat u wenst:
- claim specifieke bron:
SELECT ... FROM resources WITH (UPDLOCK, ROWLOCK) WHERE key = @key
. Wordt geblokkeerd als de resource al is geclaimd. Gebruik time-outs voor vergrendeling om een uitzondering te retourneren als de resource al is geclaimd.key
moet geïndexeerd en uniek zijn. - volgende beschikbare bron:
SELECT ... FROM resources WITH (UPDLOCK, ROWLOCK, READPAST) ORDER BY <accessorder>
. U moet een volgorde definiëren door de voorkeur van middelen uit te drukken (oudste, hoogste prioriteit enz.) - een geclaimde bron vrijgeven:
COMMIT
uw transactie.
De kern van het probleem is het gebruik van de juiste vergrendelingshints, en dit soort problemen vereist expliciete vergrendelingshints om op te lossen. UPDLOCK zal fungeren als een 'claim' lock. ROWLOCK zorgt voor de juiste granulariteit die voorkomt dat de server 'optimaliseert' naar een paginavergrendeling. Met READPAST kunt u geclaimde bronnen overslaan. Als u UPDLOCK op de rijen plaatst, wordt de rij vergrendeld en kunt u deze later bijwerken, maar worden andere bewerkingen voorkomen, zoals gewone lees-toegewezen SELECT's die de vergrendelde rij blokkeren. Het idee is echter dat je de rij toch gaat UPDATEN, wat een onvermijdelijke X-lock zal plaatsen. Als u de tabel meer beschikbaar wilt houden, kunt u app-vergrendelingen in plaats daarvan, maar is aanzienlijk moeilijker om correct uit te voeren. U moet een app-vergrendeling aanvragen voor een tekenreeksdescriptor van de bron, zoals de sleutelwaarde, of een CHECKSUM
van de sleutel of het is %%LOCKRES%%
waarde. Met app-vergrendelingen kunt u het bereik van de 'claim' scheiden van een transactie door de app-vergrendeling aan te vragen bij het 'sessie'-bereik, maar dan moet u de claim handmatig vrijgeven (app-vergrendelingen met 'transactie'-scope worden vrijgegeven op het moment van de vastlegging) . Let op, er zijn duizend manieren om jezelf in de voet te schieten met app-vergrendelingen.