Dine to udsagn får rækkelåse i forskellig rækkefølge. Det er en klassisk sag til dødvande. Du kan rette dette ved at sikre, at rækkefølgen af låse, der tages, altid er i en eller anden global rækkefølge (f.eks. sorteret efter ID). Du bør nok kombinere de to UPDATE
sætninger i én og sorter listen over ID'er på klienten, før den sendes til SQL Server. For mange typiske UPDATE
planlægger dette faktisk fungerer fint (dog ikke garanteret).
Eller du tilføjer genforsøgslogik, hvis du opdager en dødlås (SqlException.Number == 1205
). Dette er mere elegant, fordi det ikke kræver dybere kodeændringer. Men deadlocks har præstationsimplikationer, så gør kun dette ved lave deadlock-rater.
Hvis din parallelle behandling genererer mange opdateringer, kan du INSERT
alle disse opdateringer til en midlertidig tabel (som kan gøres samtidigt), og når du er færdig, udfører du en stor UPDATE
der kopierer alle de individuelle opdateringsposter til hovedtabellen. Du ændrer blot joinkilden i dine eksempelforespørgsler.