Announcement

Collapse
No announcement yet.

Timeout beim Speichern in MsSQL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Timeout beim Speichern in MsSQL

    Hallo zusammen,

    ich habe seit einiger Zeit das Problem, dass es immer wieder vorkommt dass beim Speichern einer Änderunge eines Datensatzes ein Timeout kommt. Als ich der Sachen nun nachgegangen bin, konnte ich feststellen, dass dies auch auftritt, wenn ich die Änderung direkt im SQL Server Mangement Studio vornehme. Auch ist das Verhalten unabhängig von der Server-Version. Bis gestern hatten wir mit SQL 2005 gearbeitet, seit gestern arbeiten wir mit SQL 2008 R2.
    Ich lasse mir die Daten z.B. mit
    Code:
    SELECT     TOP (200) ID, SerNr, Typ, KomNr, KomNrPos, KomNrOld, BA, BaPos
    FROM         Ser_Nr
    WHERE     (SerNr > 'IN010990')
    anzeigen. Danach trage ich z.B. in der Spalte KomNr einen Wert ein und wechsle in die nächste Zeile. Das klappt bei ein paar Zeilen und dann kann ein ganzer Block kommen, bei dem folgenden Fehlermeldung kommt:
    Es wurde keine Zeile aktualisiert
    Die Daten in Zeile 7 wurden nicht bearbeitet
    Fehlerquelle: .NET SQL Client Data Provider
    Fehlernachricht: Timeout ist abgelaufen. Das Zeitlimit wurde vor dem Beenden des Vorgangs überschritten oder der Server reagiert nicht
    Die Anweisung wurde beendet
    Wechselt man danach auf einen Datensatz der vorher ging, geht der auch weiterhin und die Änderungen sind auch in der BD hinterlegt. Der gesperrte Block lässt sich aber oft erst nach Stunden oder am nächsten Tag wieder bearbeiten.

    Wodurch kann es vorkommen, das ganze Blöcke (Datensatzbereiche) gesperrt sind. Es ist sicher, dass es nicht ganze Blöcke sind, die so auch angelegt wurden, zumal das Anlegen oft Wochen her ist.
    Wie kann man feststellen, welche Datensätze gesperrts sind
    Wie kann man die Sperrung aufheben?

    Ich erzeuge die Daten mit Delphi XE, UniDac 3 und verwende dort TUniQuery.Insert, .Edit, .Post. Das Seltsame ist aber wie gesagt, dass nur ein Teil des mal angelegten Serien-Nr.-Bereichs gesperrt ist.

    Vielen Dank für eure Unterstützung
    Gerd

  • #2
    Wodurch kann es vorkommen, das ganze Blöcke (Datensatzbereiche) gesperrt sind
    Weil in einer noch offenen Transaktion jemand eine Update in diesem Block vorgenommen hat. Und der Server wenn du es nicht explizit anders steuerst nicht nur einzelne Datensätze sperrt sondern eben ganze Pages oder ganze Tabellen.

    Wie kann man die Sperrung aufheben?
    In dem man die Transaktion beendet die den Lock hält (Commit oder Rollback ausführen).

    Um Festzustellen ob du entsprechende Sperren hast kannst du die sp_lock Prozedur verwenden oder eine Abfrage auf die sys.dm_tran_locks Sicht ausführen. Wenn du im Managment Studio mal im ContextMenü deiner Datenbank die Berichte ansiehst (z.B. Transaktionen nach Anzahl Sperren) solltest du auch entsprechende Informationen finden.

    Comment


    • #3
      Danke für das Feedback. Ich habe mir gleich mal die genannten Prozdedur und das View angeschaut, aber wirklich weitergeholfen hat es mir nicht, was sicherlich daran liegt, dass das Bereiche sind, mit denen ich mich bis jetzt nicht auseinander gesetzt habe. Gibt es ein SQL, das die ganzen ID`s gleich in Klartext anzeigt?
      Wenn du im Managment Studio mal im ContextMenü deiner Datenbank die Berichte ansiehst (z.B. Transaktionen nach Anzahl Sperren) solltest du auch entsprechende Informationen finden.
      Welche Berichte meinst du?
      Ich verstehe, dass so eine Sperre nach dem Commit aufgehoben wird. Ich kann mir aber nicht vorstellen, dass jemand so lange die Daten im Edit-Mode hält. Eigentlich gibt es in der Anwendung keine Möglichkeit mehrere Datensätze auf einmal zu editieren. In der Regel arbeitet es ein Mehrfachbefehl Zeile für Zeile ab und beendet jede Satzänderung gleich mit einem Post. Kann es sein, dass bei einem Fehler beim Post und ein angebrachten try finally Block der Satz im Sperrmode bleibt und die Anwendung so Satz für Satz sperrt? Normalerweise führt ein Satzwechsel in Delphi automatsich zu einem Post und falls der nicht klappt, klappt auch der satzwechseln nicht

      Comment


      • #4
        Eigentlich gibt es in der Anwendung keine Möglichkeit mehrere Datensätze auf einmal zu editieren
        Ein Datensatz bearbeiten heißt aber nicht das du zwingend eine Satzsperre bekommst. Es kann genauso gut gleich eine ganze Page gesperrt sein. Denn konkreten Lock Typ bekommst du aber über die von mir angesprochenen Funktionen raus. In den Links der Hilfe steht auch wie die Daten zu interpretieren sind bzw. Ids in Namen unzuwandeln sind.

        Normalerweise führt ein Satzwechsel in Delphi automatsich zu einem Post
        Das heißt aber doch nicht das auch gleich ein Commit ausgeführt wird oder?

        Welche Berichte meinst du?
        Im Kontextmenu auf der Datenbank wirst du einen Knoten Berichte bzw. Reports finden. Die meine ich.

        Comment

        Working...
        X