Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/02/2011, 15h19   #1
Expert Confirmé
 
Avatar de Marco46
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 457
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Lot (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2005
Messages : 1 457
Points : 2 796
Points : 2 796
Par défaut [SQLServer 2008 R2] Problème de blocage - code erreur 1222

* Bonjour, *

Lors de l'exécution d'une requête SELECT je prends une erreur 1222 ayant pour description "Délai de requête de verrou dépassé.".

Une transaction a échoué précédemment.
Pourtant, la table impliquée dans le SELECT ne fait pas parti de la transaction !

La requête suivante :

Code :
SELECT * FROM sys.dm_tran_locks WHERE request_owner_type = 'TRANSACTION'
Renvoi plusieurs enregistrements alors que l'application ne fonctionne pas forcément.

Comment supprimer ces blocages ?

* Merci *
__________________
"Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
Kenneth E. Boulding

"/home/earth is 102% full ... please delete anyone you can."
Inconnu
Marco46 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 18h56   #2
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
Une méthode de contournement

1.) Obtenir la valeur actuelle du paramètre LOCK_TIMEOUT, à l'aide de la commande

2.) augmenter le delai du timeout à l'aide de LOCK_TIMEOUT X

(X est le nombre de millisecondes ).


Exemple
--------
pour fixer le delai du timeout à 3 secondes il faut exécuter

__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 20h03   #3
Membre Expert
 
Inscription : juin 2007
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 056
Points : 1 078
Points : 1 078
salut

@Etienne :

Utilisation du lock_timeout : c'est un peu la méthode de l'autruche ;-) Ma requête est bloquée, ce n'est pas normal mais ce n'est pas grave car elle renvoie une erreur 1222 au bout de N secondes. Donc ces erreurs apparaîtront toujours.

Et c'est bien le soucis dans ce cas : une application .NET a par un timeout défaut qu'il faut corriger dans le code (connection.CommandTimeout (30 sec par défaut) avec .NET). C'est une aberration, et je rencontre ce soucis sur un grand nombre d'applis qui n'ont pas forcément un code à toute épreuve. Donc l'appli sort une erreur 1222 car la requête a mis plus de 30 sec à s'exécuter. Il faut donc positionner ce paramètre à 0 (temps d'exécution sans limite), malgré les conseils de Microsoft de faire l'autruche ;-).

Une erreur 1222 indique un problème grave qu'il faut résoudre.

Quand ta requête est bloquée, utilises donc la vue sys.dm_exec_requests pour afficher la liste des requêtes en cours d'exécution et repère celles pour lesquelles le blocking_session_id > 0.

Le numéro de ce champs indique le numéro de session de la session qui bloque.

Ensuite tu peux essayer d'afficher le code SQL de cette requête avec
DBCC INPUTBUFFER(<blocking_session_id>) ou utiliser une commande pour afficher l'utilisation des verrous (sp_lock par ex).

Il faudrait alors poster les commandes qui s'entrebloquent.
__________________
Emmanuel T.
kagemaru est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/02/2011, 23h14   #4
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
Salut Emmanuel,
Mais j'ai proposé "Une méthode de contournement" ;-) allez disons plutôt une méthode de l'autruche ;-)

Sinon sur le fond je suis d'accord ;-)

A+
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2011, 10h17   #5
Expert Confirmé
 
Avatar de Marco46
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 457
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Lot (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2005
Messages : 1 457
Points : 2 796
Points : 2 796
La première proposition de solution est inappropriée car comme vous le dites vous mêmes, elle ne fait que masquer le problème.

L'exécution de cette requête :

Code :
SELECT * FROM sys.dm_exec_requests WHERE blocking_session_id > 0
Ne donne aucun résultat. En enlevant la condition il y a quelques résultats.

Ceci dit, mon chef m'indique qu'il a mis en place un backup quotidien de la BDD qui s'exécute en soirée. Et ce matin je n'ai plus le problème de blocage. Disparu !

Je continuerai ce fil lorsque le problème ce représentera après exécution de la requête ci-dessus.

Sinon le LOCK_TIMEOUT est par défaut à -1 sur cette base.

Merci pour votre aide.
__________________
"Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
Kenneth E. Boulding

"/home/earth is 102% full ... please delete anyone you can."
Inconnu
Marco46 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2011, 11h07   #6
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 665
Points : 8 710
Points : 8 710
Bonjour,

Vous pouvez regarder ce billet et pour une vue plus générale, celui-ci

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h36.


 
 
 
 
Partenaires

Hébergement Web