Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Questo semplice codice produce deadlock. Semplice programma di esempio incluso

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.