2010-12-06 38 views
1

J'ai une grande application web sur asp.net 2.0. Ici, vous ouvrez l'éditeur d'objet et vous y apportez quelques modifications. Ils ne peuvent pas ouvrir le même objet en même temps. Après avoir appuyé sur "save" btn, toutes les modifications sont enregistrées pour sauvegarder sur le serveur via la publication. J'utilise la transaction pour sauvegarder. Il y a beaucoup de procédures, de vérifications et d'autres à faire avant que l'opération d'enregistrement soit OK.en attente de commande bloque les autres transactions

using (SqlConnection con = .........) 
     { 
      SqlTransaction trans = null; 
      try 
      { 
       con.Open(); 
       trans=con.BeginTransaction(IsolationLevel.ReadUncommitted); 
       ........operations......... 
       trans.Commit(); 
      } 
      catch (Exception e) 
      { 
       try { if (trans != null) trans.Rollback(); } 
       catch { } 
       throw new MyException("SQL Exception: " + e.Message, e); 
      } 
      finally 
      { 
       if (con != null && con.State == ConnectionState.Open) con.Close(); 
      } 
     } 

Pour moi ce code est assez sûr.

Mais arrive périodiquement: un processus de cette application Web sur l'opération d'enregistrement sur mssql est devenu "sleep/waiting". et d'autres processus appelés par d'autres utilisateurs sont devenus bloqués par ce processus et organisent une file d'attente. L'un d'entre eux a excédé le délai d'attente ..... mais d'autres attendent. Donc, ma question est la suivante: est-ce que mon code a une mauvaise opération qui permet à la commande de devenir endormie/en attente? Peut-être y a-t-il des trucs?

+0

Vous avez évidemment omis le code pour raccourcir votre exemple de code, donc c'est peut-être à cause de ça, mais je ne vois pas de trans.Commit() appeler n'importe où dans votre code? – jvanrhyn

+0

De cause j'ai ....... – cyssima

+0

Quel est le but du bloc catch vide après 'try {if (trans! = Null) trans.Rollback(); } '. Vous vous demandez si cela enterre une erreur. –

Répondre

1

Puisque vous faites beaucoup de DB d'opérations dans une transaction, il est possible qu'un verrou de base de données bloque votre application.

Vous pouvez utiliser la procédure sp_who2 stockée (il y a plus de détails sur celle-ci here) pour voir s'il y a des blocs sur votre serveur, en vérifiant la colonne BlkBy du résultat.

Vous pouvez également consulter les liens suivants sur Sql Server locks et deadlocking

+0

Oui, il y a beaucoup d'opérations de base de données. DB est très chargé. Mais pourquoi ces commandes existent dans DB. Si DB wii verrouille ma commande, l'application avec throw une exception et la transaction seront annulées. Cela peut arriver, mais cette commande existe toujours et d'autres l'attendent. – cyssima

+0

Aucune exception n'est levée sur les verrous, à l'exception des exceptions de délai d'attente si vous avez défini un délai d'expiration sur la commande exécutant la transaction. Essayez d'utiliser la procédure stockée sp_who2 pour voir si des processus se bloquent dans votre base de données. –

+0

Je l'ai dit au dernier cas - il n'y avait pas d'impasse. La première commande dormait/attendait, la seconde était verrouillée par 1-ème, 3-ème par 2-nd ......... etc – cyssima

0

Mais le principal problème est que le premier processus n'a pas jeté exception délai d'attente. Il dort comme une bûche car on ne le tue pas. C'est le problème principal.

0

Может ли это быть связано с репликацией. В момент когда наблюдаются описанные выше тормоза репликация начинает сильно тормозить. Erreur: Le processus n'a pas pu se connecter à Publisher 'эта бд'. (Source: MSSQL_REPL, Numéro d'erreur: MSSQL_REPL20084) Obtenir de l'aide: http://help/MSSQL_REPL20084

· Fournisseur TCP: Une tentative de connexion a échoué car le parti connecté n'a pas répondu correctement après une période de temps, ou une connexion établie a échoué car l'hôte de connexion a échoué répondre. (Source: MSSQLServer, numéro d'erreur: 10060) Obtenir de l'aide: · Une erreur s'est produite lors de l'établissement d'une connexion au serveur. Lors de la connexion à SQL Server 2005, cet échec peut être dû au fait que, dans les paramètres par défaut, SQL Server n'autorise pas les connexions distantes. (Source: MSSQLServer, numéro d'erreur: 10060) Obtenir de l'aide: · Le délai de connexion a expiré (Source: MSSQLServer, Numéro d'erreur: 0) Obtenir de l'aide: · Le processus de fusion n'a pas pu exécuter une requête car la requête a expiré. Si cet incident persiste, augmentez le délai d'expiration de la requête pour le processus. Lors du dépannage, redémarrez la synchronisation avec la consignation de l'historique détaillé et spécifiez un fichier de sortie dans lequel écrire. (Source: MSSQLServer, numéro d'erreur: 0) Obtenir de l'aide: Эта БД является источником репликации.