Вашите две изявления придобиват заключвания на редове в различен ред. Това е класически случай за безизходици. Можете да коригирате това, като се уверите, че редът на взетите брави винаги е в някакъв глобален ред (например подреден по ID). Вероятно трябва да обедините двата UPDATE
изрази в едно и сортирайте списъка с идентификатори на клиента, преди да го изпратите на SQL Server. За много типични UPDATE
планове, това всъщност работи добре (не е гарантирано обаче).
Или добавяте логика за повторен опит, в случай че откриете блокиране (SqlException.Number == 1205
). Това е по-елегантно, защото не изисква по-дълбоки промени в кода. Но блокиранията имат отражение върху производителността, така че правете това само за ниски нива на блокиране.
Ако вашата паралелна обработка генерира много актуализации, можете да INSERT
всички тези актуализации във временна таблица (което може да се направи едновременно) и когато сте готови, изпълнявате едно голямо UPDATE
който копира всички отделни записи за актуализиране в главната таблица. Просто променяте източника на присъединяване във вашите примерни заявки.