Le tue due istruzioni acquisiscono blocchi di riga in un ordine diverso. Questo è un classico caso di deadlock. Puoi risolvere questo problema assicurandoti che l'ordine dei blocchi presi sia sempre in un ordine globale (ad esempio, ordinato per ID). Probabilmente dovresti unire i due UPDATE
istruzioni in una e ordina l'elenco di ID sul client prima di inviarlo a SQL Server. Per molti tipici UPDATE
piani questo funziona davvero bene (non garantito, però).
Oppure aggiungi la logica dei tentativi nel caso in cui rilevi un deadlock (SqlException.Number == 1205
). Questo è più elegante perché non richiede modifiche al codice più profonde. Ma i deadlock hanno implicazioni sulle prestazioni, quindi esegui questa operazione solo per bassi tassi di deadlock.
Se la tua elaborazione parallela genera molti aggiornamenti, puoi INSERT
tutti quegli aggiornamenti in una tabella temporanea (che può essere eseguita contemporaneamente) e quando hai finito esegui un grande UPDATE
che copia tutti i singoli record di aggiornamento nella tabella principale. Devi solo cambiare l'origine del join nelle tue query di esempio.