Dina två påståenden får radlås i olika ordning. Det är ett klassiskt fall för dödlägen. Du kan fixa detta genom att se till att ordningen på lås som tas alltid är i någon global ordning (till exempel beställt efter ID). Du bör förmodligen sammanfoga de två UPDATE
satser till ett och sortera listan med ID:n på klienten innan du skickar den till SQL Server. För många typiska UPDATE
planerar att detta faktiskt fungerar bra (inte garanterat dock).
Eller så lägger du till logik för ett nytt försök om du upptäcker ett dödläge (SqlException.Number == 1205
). Detta är mer elegant eftersom det inte kräver några djupare kodändringar. Men deadlocks har prestandaimplikationer så gör detta bara för låga deadlock-frekvenser.
Om din parallella bearbetning genererar många uppdateringar kan du INSERT
alla dessa uppdateringar till en temporär tabell (som kan göras samtidigt) och när du är klar kör du en stor UPDATE
som kopierar alla individuella uppdateringsposter till huvudtabellen. Du ändrar bara anslutningskällan i dina exempelfrågor.