sql >> Databasteknik >  >> RDS >> Sqlserver

Denna enkla kod skapar dödläge. Enkelt exempelprogram ingår

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.



  1. Synkroniseringsram:Oracle/SQLServer

  2. Hur använder man flera WITH-satser i en PostgreSQL-fråga?

  3. Sätt in i en Temp-tabell i en CTE

  4. Laddar KML-fil till mysql / xpath och x quires