J'ai tiré mes cheveux sur cette impasse:
[ Agrandir ]
IX_OrderAmounts est une vue indexée faisant des agrégations sur la table Amount. La transaction sur la gauche (lecture répétable – bien que cela se produise avec Read validée) n'insère qu'une seule ligne dans la table Montant. La transaction sur la droite (Read committed) met à jour quelques lignes (2 à 3 lignes) de la table Amount (toutes dans une instruction UPDATE).
Maintenant, ce que je ne comprends pas est pourquoi la transaction sur la gauche, qui a seulement besoin d'insert une ligne, doit acquérir un deuxième verrou de mise à jour.
Parce que le blocage est sur la vue indexée que je ne mets pas à jour directement, je ne peux pas vraiment utiliser les astuces SQL (ou du less je ne sais pas comment).
Comment puis-je résoudre cette impasse?
Les methods typiques que vous pouvez utiliser pour résoudre les blocages incluent:
Garder les transactions aussi courtes que possible.
Dans SQL Server, vous pouvez également réduire les conflits de locking tout en protégeant les transactions contre les lectures incorrectes des modifications de données non validées en utilisant:
Charger SQL Profiler en mettant l'accent sur le locking, initier les scripts qui bloquent spécifiquement pour cette database et le nourrir dans le conseiller d'optimization du moteur de database, et examiner les suggestions.
Notes de bas de page : http://support.microsoft.com/kb/832524
[[1]: http://support.microsoft.com/kb/832524
http://www.codeproject.com/Articles/42547/SQL-SERVER-How-To-Handle-Deadlock
Question de locking Stackoverflow précédente question de savoir comment résoudre le problème de blocage?