Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Ce code simple produit un blocage. Exemple de programme simple inclus

Vos deux instructions acquièrent des verrous de ligne dans un ordre différent. C'est un cas classique pour les impasses. Vous pouvez résoudre ce problème en vous assurant que l'ordre des verrous pris est toujours dans un ordre global (par exemple, classé par ID). Vous devriez probablement fusionner les deux UPDATE instructions en une seule et triez la liste des ID sur le client avant de l'envoyer à SQL Server. Pour de nombreux UPDATE typiques prévoit que cela fonctionne correctement (cependant, ce n'est pas garanti).

Ou, vous ajoutez une logique de nouvelle tentative au cas où vous détecteriez un blocage (SqlException.Number == 1205 ). Ceci est plus élégant car il ne nécessite aucune modification de code plus profonde. Mais les interblocages ont des implications sur les performances, ne faites donc cela que pour les faibles taux d'interblocage.

Si votre traitement parallèle génère de nombreuses mises à jour, vous pouvez INSERT toutes ces mises à jour dans une table temporaire (qui peuvent être effectuées simultanément) et lorsque vous avez terminé, vous exécutez un gros UPDATE qui copie tous les enregistrements de mise à jour individuels dans la table principale. Vous modifiez simplement la source de jointure dans vos exemples de requêtes.