Uw twee verklaringen krijgen rijsloten in verschillende volgorde. Dat is een klassiek geval voor impasses. U kunt dit oplossen door ervoor te zorgen dat de volgorde van de genomen sloten altijd in een globale volgorde is (bijvoorbeeld gesorteerd op ID). U moet waarschijnlijk de twee UPDATE
. samenvoegen instructies in één en sorteer de lijst met ID's op de client voordat u deze naar SQL Server verzendt. Voor veel typische UPDATE
plannen werkt dit eigenlijk prima (maar niet gegarandeerd).
Of u voegt logica voor opnieuw proberen toe voor het geval u een impasse ontdekt (SqlException.Number == 1205
). Dit is eleganter omdat er geen diepere codewijzigingen nodig zijn. Maar deadlocks hebben gevolgen voor de prestaties, dus doe dit alleen bij lage deadlock-percentages.
Als uw parallelle verwerking veel updates genereert, kunt u INSERT
al die updates in een tijdelijke tabel (die gelijktijdig kan worden gedaan) en als je klaar bent, voer je één grote UPDATE
uit die alle afzonderlijke updaterecords naar de hoofdtabel kopieert. U wijzigt gewoon de join-bron in uw voorbeeldquery's.