web-dev-qa-db-fra.com

Blocage de transaction pour la requête de sélection

Parfois, j'ai l'erreur suivante pour une procédure stockée qui n'est qu'une requête Select: Transaction (Process ID 91) was deadlocked on lock

Ma compréhension initiale était qu'une requête de sélection ne verrouillerait pas une table, ni ne provoquerait un blocage même si la table qu'elle tente d'interroger est mise à jour/verrouillée par un autre processus, mais il semble qu'une requête de sélection puisse provoquer des blocages comme bien.

Si je définis le niveau d'isolement pour lire non engagé pour la requête, cela résoudra-t-il le problème?

27
peanut

Ma compréhension initiale est qu'une requête Select ne verrouillera pas une table, ni ne provoquera un blocage

Cette compréhension est fausse. Les requêtes SELECT prennent des verrous partagés sur les lignes qu'elles analysent. Les verrous partagés peuvent entrer en conflit avec les verrous exclusifs des instructions update/delete/insert. Deux instructions SELECT ne vont pas dans un blocage, mais un SELECT peut se bloquer dans un UPDATE. Lorsqu'un tel blocage se produit, le SELECT est généralement la victime car il n'a effectué aucune mise à jour et va donc toujours perdre le tirage.

Comme pour tout blocage, vous devez publier le schéma exact des tables impliquées, les instructions T-SQL exactes et le graphique de blocage. Voir Comment: enregistrer des graphiques de blocage (SQL Server Profiler) . Avec ces informations, vous pouvez recevoir des conseils sur la façon de résoudre le blocage.

43
Remus Rusanu

Comme le dit Remus, vous obtenez les blocages parce que les opérations SELECT et UPDATE (ou autres) se bloquent mutuellement, pas SELECT vs SELECT. Vous devrez examiner toutes vos requêtes touchant cette table et créer des index de couverture appropriés pour ces requêtes et cela résoudra vos problèmes. Un bon indice de couverture est la solution préférée plutôt que d'utiliser des indications de table WITH (NOLOCK).

Voir ce qui suit link pour un bon tutoriel sur la façon de créer des index de couverture et comment cela affecte les blocages.

6
Ghlouw

Si vous utilisez SQL Server 2008, vous pouvez définir le niveau d'isolement sur lecture non validée pour éviter le blocage. Voir ceci lien . Lors de la lecture non validée ou AVEC (NOLOCK), il faut être conscient que les données annulées par la requête peuvent ne pas être RÉELLES!

4
RC_Cleland