2010-12-06 4 views
1

Ich habe eine große Web-Anwendung auf asp.net 2.0. Usere öffnen Objekt-Editor dort und macht einige Änderungen. Sie können nicht das gleiche Objekt auf einmal öffnen.Schlafen warten Befehl blockiert andere Transaktionen

Nach dem Drücken von "Speichern" btn alle Änderungen Prozess auf Server über Postback zu speichern.

Ich verwende Transaktion zum Speichern. Es gibt eine Menge von Prozeduren, Überprüfungen und anderen Vorgängen, bevor der Speichervorgang in Ordnung ist.

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(); 
      } 
     } 

Für mich ist dieser Code ziemlich sicher.

Aber regelmäßig passiert: ein Prozess von dieser Webanwendung auf Speichern-Vorgang auf mssql wurde "schlafen/warten". und andere Prozesse, die von anderen Benutzern aufgerufen wurden, wurden von diesem Prozess gesperrt und organisieren eine Warteschlange.

Einer von ihnen warf Timeout Excection ..... aber andere warten.

Also meine Frage ist: hat mein Code einige schlechte Operation, die Befehl ermöglicht zu schlafen/warten? Vielleicht gibt es ein paar Tricks?

+0

Sie haben offensichtlich Code weggelassen, um Sie Code Beispiel zu verkürzen, so könnte es daran liegen, aber ich sehe kein trans.Commit() Call irgendwo in Ihrem Code? – jvanrhyn

+0

Aus Grund habe ich ....... – cyssima

+0

Was ist der Zweck des leeren Catch-Block nach "try {if (trans! = Null) trans.Rollback(); } '. Ich frage mich, ob das einen Fehler begräbt. –

Antwort

1

Da Sie in einer Transaktion viele Operationen ausführen, besteht die Möglichkeit, dass eine Datenbanksperre Ihre Anwendung blockiert.

Sie können die gespeicherte sp_who2-Prozedur verwenden (es gibt weitere Details dazu here), um zu sehen, ob es irgendwelche Blöcke auf Ihrem Server gibt, indem Sie die BlkBy-Spalte des Ergebnisses überprüfen.

könnten Sie auch folgende Links auf Sql Server locks und deadlocking

+0

Ja, es gibt viele DB-Operationen. DB ist sehr geladen. Aber warum sind diese Befehle in DB vorhanden? Wenn DB meinen Befehl sperrt, wird eine Anwendung mit einer Ausnahme ausgelöst und die Transaktion wird zurückgesetzt. Es mag passieren, aber dieser Befehl existiert noch und andere warten darauf. – cyssima

+0

Es werden keine Ausnahmen für Sperren ausgelöst, außer Timeout-Ausnahmen, wenn Sie für den Befehl, der die Transaktion ausführt, eine Zeitüberschreitung festgelegt haben. Versuchen Sie, die gespeicherte Prozedur sp_who2 zu verwenden, um festzustellen, ob sich tatsächlich Prozesse gegenseitig in Ihrer Datenbank blockieren. –

+0

Ich habe das letztens gecheckt - es gab keinen Stillstand. Der 1. Befehl war schlafen/warten, der zweite wurde durch 1., 3. - durch 2-nd ......... etc – cyssima

0

Aber das Hauptproblem ist, zu überprüfen, ob der erste Prozess nicht Timeout Ausnahme nicht geworfen. Es schläft, als würden wir ihn nicht töten. Das ist das Hauptproblem.

0

Может ли это быть связано с репликацией. В момент когда наблюдаются описанные выше тормоза репликация начинает сильно тормозить. И пишет: Der Prozess konnte keine Verbindung zum Verleger "эта бд" herstellen. (Quelle: MSSQL_REPL, Fehlernummer: MSSQL_REPL20084) Hier finden Sie Hilfe: http://help/MSSQL_REPL20084

· TCP-Provider: Ein Verbindungsversuch ist fehlgeschlagen, da die verbundene Partei nicht richtig nach einer Zeitspanne reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host ausgefallen ist Antworten. (Quelle: MSSQLServer, Fehlernummer: 10060) Hilfe erhalten: · Beim Herstellen einer Verbindung zum Server ist ein Fehler aufgetreten. Bei der Verbindung mit SQL Server 2005 kann dieser Fehler dadurch verursacht werden, dass SQL Server unter den Standardeinstellungen keine Remoteverbindungen zulässt. (Quelle: MSSQLServer, Fehlernummer: 10060) Hilfe erhalten: · Login-Timeout abgelaufen (Quelle: MSSQLServer, Fehlernummer: 0) Hilfe erhalten: · Der Zusammenführungsprozess konnte eine Abfrage nicht ausführen, weil die Abfrage abgelaufen ist. Wenn dieser Fehler weiterhin auftritt, erhöhen Sie das Abfragetimeout für den Prozess. Starten Sie bei der Fehlerbehebung die Synchronisierung mit der ausführlichen Verlaufsprotokollierung neu und geben Sie eine Ausgabedatei an, in die geschrieben werden soll. (Quelle: MSSQLServer, Fehlernummer: 0) Hilfe erhalten: Эта БД является источником репликации.