Problème d'interblocage à cause d'un locking de mise à jour

Nous avons un problème d'impasse que nous essayons de détecter. J'ai un graphe de blocage (xdl) généré à partir de Profiler. Il montre l'instruction SQL perdue comme une instruction Select simple, pas une instruction Update, Delete ou Insert. Le graphique montre l'instruction Select perdue comme demandant un verrou partagé sur une ressource **but also owning an Update lock on a resource** . C'est ce qui me déconcerte. Pourquoi une instruction Select qui ne fait pas partie d'une insertion, d'une mise à jour ou d'une suppression contient-elle un verrou de mise à jour sur une ressource?

Je devrais append que le verrou de mise à jour qu'il possède est sur la table étant sélectionné par l'instruction Select perdante.

EDIT: S'il vous plaît ne suggère pas d'utiliser NoLock. Oui cela résoudrait le problème mais en introduit un nouveau – un problème de lecture sale. Cette requête frappe un server de production. Ce que je veux vraiment savoir, c'est pourquoi une instruction Select émet un verrou de mise à jour.

Vous êtes sûr que SELECT possède le verrou U?

Comme vous le savez, les verrous U et X (ainsi que les verrous S sérialisables) sont conservés pour la durée de la transaction , pas pour l'instruction. Il est donc parfaitement possible qu'une transaction qui a émis une écriture possède un verrou U, à partir d'une instruction précédemment exécutée. Pourquoi posséder un verrou en U, par opposition à un verrou X (c'est-à-dire qu'il possède un verrou en U qui n'a pas été mis à jour en X ) est un casse-tête en soi, mais je peux imaginer deux façons de le faire.
Il est donc parfaitement possible d'avoir une instruction SELECT pour posséder des verrous X / U si elle fait partie d'une transaction à plusieurs instructions. Un SELECT autonome avec un verrou en U sous sa ceinture, c'est un peu inhabituel, je pense.

Le blocage type SELECT par rapport à UPDATE survient sur les scénarios d'ordre d'access à l'index, comme celui décrit dans le blocage de lecture / écriture . Je crois que vous avez fait une lecture assidue du graphique de l'impasse, mais si ce n'est pas trop requestr, pouvez-vous le partager?

Oh, et btw, avez-vous considéré lire l'instantané commis?

Une instruction select crée un verrou partagé. essayez de sélectionner avec l'indice nolock. Cela résoudrait le problème.

par exemple, select * dans la table (nolock)

Peut-être que le select a été invoqué avec UPDLOCK hint? Quoi qu'il en soit, pouvez-vous utiliser l'isolation des instantanés et éliminer le problème?