IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Timeout lors de l'exécution d'une procédure stockée


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Par défaut Timeout lors de l'exécution d'une procédure stockée
    Bonjour

    Aujourd'hui lors d'un process en production, j'ai rencontre un probleme que nous n'avions jamais eu auparavant.

    Un web service est appele pour metter a jour certaines donnees dans une bdd.

    voila un pseudo code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    reader = execute(sp1)
     
    while (reader.read())
     
    //get current row detail 
    //create parameters
    execute(sp2, params)
     
    end while
    c'est donc assez basique.

    Et donc voila le probleme, l'execution de sp2 (qui n'est rien d'autre qu'un simple update en SQL) a commence a renvoyer l'exception suivante:

    System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
    Le probleme a ete reproduit systematiquement, pour la meme ligne de la table mise a jour, une bonne quinzaine de fois d'affile.

    Apres avoir modifie le code vite fait pour "sauter" cette ligne, tout le reste de la table a ete mise a jour avec succes.

    Ma question est la suivante:

    Y'a-t-il quoique ce soit d'autre qu'un lock sur cette ligne qui pourrait causer ce probleme ?

    Merci

    Edit
    Je precise un peu les environnements :

    - SQL server 2008
    - IIS 7
    - Web service asp.net "classique" (pas WCF quoi)
    - ADO.NET pour tout ce qui est connection/execution des commandes SQL
    - .NET 4 pour le runtime

    c'est a peu pres tout je crois

    Ce message a peut-etre davantage sa place sur le forum SQL-server je ne sais pas...

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 69
    Par défaut
    il nous faudra le code SQL de mise à jour . Je pense que le plantage est là .
    regarde par la meme occasion s'il y a des trigger sur la table

  3. #3
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bonjour

    Tu peux toujours augmenter le CommandTimeOut dans l'objet commande.

    Sinon, un truc m'interpelle quand même à la lecture de ton pseudo-code : pourquoi as tu un code qui apelle une prco stoc et en fonction du retour rapelle une autre proc stoc sur les données retournées ? il y a une raison précise pour que l'ensemble du traitement ne soit pas confié au SGBD et fasse des allez-retour de données vers le web service ?

    En dehors de cela, la question relève plus de Sql Server que de C#.

    Vous avez utilisé le Profiler pour voir les requêtes au sein des PS qui prennent du temps ?

  4. #4
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Bonjour

    Tu peux toujours augmenter le CommandTimeOut dans l'objet commande.

    Sinon, un truc m'interpelle quand même à la lecture de ton pseudo-code : pourquoi as tu un code qui apelle une prco stoc et en fonction du retour rapelle une autre proc stoc sur les données retournées ? il y a une raison précise pour que l'ensemble du traitement ne soit pas confié au SGBD et fasse des allez-retour de données vers le web service ?

    En dehors de cela, la question relève plus de Sql Server que de C#.

    Vous avez utilisé le Profiler pour voir les requêtes au sein des PS qui prennent du temps ?
    La principale raison est que ca a ete code n'importe comment

    Oui pour profiler et la requete qui plante coute cacahuete en resource comme le code peut le laisser penser.

  5. #5
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Par défaut
    Citation Envoyé par sofienems Voir le message
    il nous faudra le code SQL de mise à jour . Je pense que le plantage est là .
    regarde par la meme occasion s'il y a des trigger sur la table
    le code SQL de mise a jour est simple comme bonjour:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure [dbo].[sp_UpdatePaymentDairyAfterUserDocUpdateForCredit]
    @Diary_ID varchar(20)=null,
    @Payee_Account_Location varchar(10)=null,
    @Payee_Account_Number varchar(10)=null
    as
    Begin
     
    	update Payment_Diary set  
        Payee_Account_Location = @Payee_Account_Location  ,
        Payee_Account_Number =@Payee_Account_Number
        where ID=@Diary_ID
    End
    Je precise avant toute remarque concernant le nommage de la procedure que j'ai herite de ce projet en mode support uniquement, et que bah... y'a du boulot quoi

    enfin bref, c'est donc un update ultra con.
    Je reprecise ce qui s'est passe:
    - cette procedure n'a a ma connaissance jamais plante auparavant.

    - hier elle m'a sorti un timeout 15 fois d'affille sur la meme ligne (time out etait de 30 sec par defaut, pousse a 4 min, meme constat, j'ai le sentiment que j'aurais pu mettre 1h ca aurait ete pareil)

    - Un restart du server SQL n'a pas resolu le probleme

    - pas de trigger sur la table, ni d'index, et le champ ID n'est meme pas defini comme cle primaire (oui nous avons egalement herite de bases de donnees en ruine)

    voila tout ca reunis je me dis que ca ne peut venir que d'un lock qui se serait glisse je ne sais encore comment, mais j'aimerais elimine toute autre possibilite.
    Qu'en pensez-vous? cela peut-il venir d'autre chose que d'un rowlock ?

    et au passage, un restart du server SQL n'est pas sense retirer tous les locks existants ?

    Merci

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par duffman Voir le message
    le champ ID n'est meme pas defini comme cle primaire (oui nous avons egalement herite de bases de donnees en ruine)

    voila tout ca reunis je me dis que ca ne peut venir que d'un lock qui se serait glisse je ne sais encore comment, mais j'aimerais elimine toute autre possibilite.
    Qu'en pensez-vous? cela peut-il venir d'autre chose que d'un rowlock ?
    Combien y a-t-il de lignes dans votre table Payment_Diary ?

  7. #7
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Par défaut
    bonjour

    la table contient 39000 lignes environ.

    voila le code de la table en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
    /****** Object:  Table [dbo].[Payment_Diary]    Script Date: 02/03/2012 10:41:21 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    SET ANSI_PADDING ON
    GO
     
    CREATE TABLE [dbo].[Payment_Diary](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[Amount] [money] NULL,
    	[Document_ID] [int] NULL,
    	[Document_Reference] [varchar](50) NULL,
    	[Interchange_ID] [varchar](50) NULL,
    	[Payee_Account_Location] [varchar](50) NULL,
    	[Payee_Account_Name] [varchar](50) NULL,
    	[Payee_Account_Number] [varchar](50) NULL,
    	[Payer_Account_Location] [varchar](50) NULL,
    	[Payer_Account_Name] [varchar](50) NULL,
    	[Payer_Account_Number] [varchar](50) NULL,
    	[Payer_UserId] [varchar](14) NULL,
    	[Payment_Date] [datetime] NULL,
    	[Status_Date] [datetime] NULL,
    	[Status_Flag] [int] NULL,
    	[Stamp] [datetime] NULL,
    	[User_ID] [int] NULL,
    	[EmployerID] [int] NULL,
    	[SS_User_Document_ID] [int] NULL,
    	[Channel_Code] [varchar](50) NULL,
    	[Payer_Method_Flag] [char](10) NULL,
    	[Credit_Interval] [int] NULL,
    	[Payee_ABN] [varchar](14) NULL,
    	[Payee_Name] [varchar](50) NULL,
    	[Payee_Bank_Account_Flag] [char](1) NULL,
    	[Product_ID] [int] NULL,
    	[Product_Code] [varchar](50) NULL,
    	[Debit_Interval] [int] NULL
    ) ON [PRIMARY]
     
    GO
     
    SET ANSI_PADDING OFF
    GO

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Rajoutez une clef primaire sur la colonne ID, vous devriez noter une très nette amélioration !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur lors de l'exécution d'une procédure stockée
    Par sab_info dans le forum Développement
    Réponses: 7
    Dernier message: 15/03/2013, 17h27
  2. [XL-2003] Erreur lors de l'exécution d'une procédure
    Par pacocnec dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/06/2009, 13h39
  3. Erreurs lors de l'exécution d'une procédure
    Par vanesa dans le forum PL/SQL
    Réponses: 2
    Dernier message: 05/01/2009, 18h48
  4. Problème lors de l'appel d'une procédure stockée
    Par ToxiZz dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 22/05/2006, 00h42
  5. Accès non autorisé à l'exécution d'une procédure stockée
    Par celine33 dans le forum Bases de données
    Réponses: 6
    Dernier message: 11/01/2006, 11h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo