0

Je suis novice en tant que DBA SQL Server, tous les jours au moins une fois que j'ai un problème de blocage dans le serveur SQL Server 2012 qui utilise l'instruction Merge. Il n'y a aucune clause comme NOLOCK, UPDLOCK, HOLDLOCK a été utilisée dans l'instruction de fusion. C'est un environnement multi-utilisateurs où BizTalk lit le fichier XML et enregistre les données dans SQL Server.blocage de SQL Server - correctif requis

Par minute, Biztalk lit 300 messages XML. Comme c'est un serveur de production, je ne peux rien mettre en œuvre de la sorte sans faire de recherche, mais je n'ai aucune idée sur la façon de résoudre ce problème. Récemment, j'ai eu un problème avec deux messages XML essayant de mettre à jour des données dans une table et essayant d'utiliser le même index et erreur-out. Quelqu'un pourrait-il m'aider à sortir de ce problème?

+0

Si vous pouvez obtenir un cas reproductible, exécutez une trace SQL en le reproduisant, en vous assurant de suivre tous les événements 'deadlock'. Cela peut vous donner des informations sur exactement ce que SQL est la supercherie, et sur exactement quelle ressource. Les deadlocks résultent presque toujours d'un thread allant après la ressource A puis B, tandis qu'un autre passe après B, puis A. Parfois, vous pouvez ajouter ou supprimer des index pour supprimer l'interblocage, mais d'autres fois vous devez réviser le code pour toujours obtenir les mêmes ressources. commande. – pmbAustin

+0

J'ai pris la trace de l'impasse et j'ai compris où était le problème. Cependant, l'impasse ne se produit pas toujours mais souvent à partir de l'instruction de fusion, ce qui m'embarrasse assez pour prendre une décision. – aprasy

+0

Le graphique Deadlock devrait montrer l'élément exact qui est en train d'être bloqué (un identifiant d'objet qui identifiera un index spécifique, par exemple). C'est là que vous devez commencer. Il y aura un très grand ID, et vous pouvez utiliser ce SQL pour décoder exactement à quoi il fait référence: SELECT hobt_id, nom_objet (p. [Object_id]), index_id FROM sys.partitions p O WH hobt_id = 72057594060734464 - remplacer par votre identifiant de verrouillage spécifique – pmbAustin

Répondre

0

La phase d'analyse de MERGE est effectuée avec un verrou partagé (S), optimisé pour le cas d'une seule session exécutant MERGE et de sessions simultanées exécutant SELECT. Dans le cas de plusieurs instructions MERGE simultanées, cela peut entraîner des blocages ou des échecs.

La solution que vous devez ajouter un indicateur HOLDLOCK sur la table cible. C'est un peu incohérent avec d'autres modèles de lecture en mise à jour qui utilisent UPDLOCK sur SELECT.