Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Dieser einfache Code erzeugt Deadlocks. Einfaches Beispielprogramm enthalten

Ihre beiden Anweisungen erwerben Zeilensperren in unterschiedlicher Reihenfolge. Das ist ein klassischer Fall für Deadlocks. Sie können dies beheben, indem Sie sicherstellen, dass die Reihenfolge der genommenen Sperren immer in einer globalen Reihenfolge ist (z. B. sortiert nach ID). Sie sollten wahrscheinlich die beiden UPDATE zusammenführen -Anweisungen in eine und sortieren Sie die Liste der IDs auf dem Client, bevor Sie sie an SQL Server senden. Für viele typische UPDATE plant, dass dies tatsächlich funktioniert (allerdings nicht garantiert).

Oder Sie fügen Wiederholungslogik hinzu, falls Sie einen Deadlock erkennen (SqlException.Number == 1205 ). Dies ist eleganter, da keine tieferen Codeänderungen erforderlich sind. Deadlocks wirken sich jedoch auf die Leistung aus. Tun Sie dies also nur bei niedrigen Deadlock-Raten.

Wenn Ihre Parallelverarbeitung viele Aktualisierungen generiert, können Sie INSERT verwenden all diese Aktualisierungen in eine temporäre Tabelle (was gleichzeitig erfolgen kann) und wenn Sie fertig sind, führen Sie ein großes UPDATE aus die alle einzelnen Update-Sätze in die Haupttabelle kopiert. Sie ändern einfach die Join-Quelle in Ihren Beispielabfragen.