Deadlock sur la vue indexée

J'ai tiré mes cheveux sur cette impasse:

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:

  • Ajouter et supprimer des index.
  • Ajout de conseils d'index.
  • Modification de l'application pour accéder aux ressources dans un model similaire.
  • Suppression de l'activité de la transaction comme les triggersurs.
  • 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:

    • Le niveau d'isolation READ COMMITTED avec l'option de database READ_COMMITTED_SNAPSHOT définie sur ON.
    • Le niveau d'isolement SNAPSHOT.

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?