Announcement

Collapse
No announcement yet.

Deadlocks verhindern

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

  • Deadlocks verhindern

    Hallo,

    Wir haben in letzter Zeit zunehmende Probleme mit Deadlock- Meldungen aus Firebird.
    Im Einsatz sind verschiedene Firebird- Version (1.5, 2.1, 2.5).
    Es ist nicht erkennbar, dass es bei einer bestimmten Version häufiger auftritt als bei anderen.
    Unsere Anwendung (Warenwirtschaft, in Delphi 7 erstellt, Datenzugriffskomponenten auf Basis FIBPlus) arbeitet meist im Mehrbenutzermodus auf mehreren Arbeitsplätzen simultan mit der selben Datenbank.

    Beim Erstellen eines Beleges (z.B. Rechnung) werden nacheinander einzelne Positionen der Rechnung erfasst. Beim Speichern der Position wird nun per Trigger (active after insert or update or delete) eine Stored Procedure aufgerufen, die die Werte und Mengen dieser Position in einer Statistiktabelle aktualisiert.

    Und genau hier bei dieser Statistiktabelle treten ab und an Deadlocks auf, die letztlich die Verbuchung der Position verhindern.

    Im Bereich der manuellen Erfassung von Belegen könnte man das Ganze noch an der Oberfläche abfangen, es gibt aber auch automatische Abläufe, in denen Positionen programmgesteuert angelegt werden. Auftretende Deadlocks in diesem Bereich haben uns bereits mehrfach heftige Probleme bereitet – bis hin zu Datenverlusten.

    Fragen:

    1. Gibt es auf Ebene der Trigger die Möglichkeit, einen Ablauf der Art
    try
    Aufruf der Verbuchungsprozedur
    except
    Warte ein Weilchen...
    Aufruf der Verbuchungsprozedur
    ...
    end;
    zu realisieren?

    2. Würde es Sinn machen, die „Post“- Prozedur der Datenzugriffskomponenten in eine solche Struktur zu packen?
    try
    Post;
    except
    Deadlock?
    Dann warte ein Weilchen...
    Post;
    ...
    end;

  • #2
    Ist vermutlich eine Frage, wie in der Warenwirtschaft mit Transaktionen umgehts. Isolation Level, Wait/No-Wait, Record-Version/No-Record-Version, wird AutoCommit verwendet etc ...

    Im Wesentlichen treten Deadlocks dann auf, wenn zwei aktive Transaktionen ein und den selben Datensatz ändern wollen. Oder auch bei Lese/Schreib-Transaktionen im No-Record-Version Modus etc.

    Ich würde mal die Transaktionseinstellungen beleuchten.

    lg,
    Thomas
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment


    • #3
      Hi,

      habe ein ähnliches Problem.

      kriege aber nicht identifiziert, wo der lock verursacht wird. Gibt es unter Firebird, so etwas wie den Alertlog im Oracle??? Wenn ich weis wo es knallt ist die Ursachenforschung einfacher.

      Comment

      Working...
      X