von pichel » So 9. Jun 2024, 13:15
Hallo,
zunächst einmal zum letzten Punkt: Wenn
Performance-Daten nicht eingefügt werden können, hat das überhaupt keinen Einfluss auf die Funktionsweise der Software. Es fehlt dann nur ein Messpunkt der Daten zur Performancemessung, wie sie in in der Statistikansicht eingesehen werden können.
Aber nun zum eigentlichen
Deadlock-Problem. In der Software verwende ich Transaktionen für bestimmte Aktionen. Transaktionen können als eine logische Einheit betrachtet werden, weil sie den Datenbestand nach fehlerfreier und vollständiger Ausführung in einem konsistenten Zustand hinterlassen. Transaktionen werden also entweder vollständig und fehlerfrei oder gar nicht ausgeführt. Wenn man aber stets nur einem Prozess bzw. Verbindung Schreibberechtigung zu erteilt und ansonsten die gesamte Datenbank für alle anderen Prozesse einzufriert, reduziert man die Leistungsfähigkeit und das kann bei vielen gleichzeitigen Zugriffen bis zur Unbenutzbarkeit führen. Aus dem Grund gibt es verschiedene Stufen des Isolierung bei Transaktionen. Leider kann es dann aber bei vielen gleichzeitigen Zugriffen immer passieren, dass es zu einem Deadlock kommt: zwei Prozesse warten jeweils auf den anderen, um fortzufahren.
Beispiel:
Code: Alles auswählen
Verbindung 1: lockt key(1), lockt key(2);
Verbindung 2: lockt key(2), lockt key(1);
Wenn nun beide Prozesse gleichzeitig ausgeführt werden, wird über Verbindung 1 der (1) gelockt, über Verbindung 2 der (2). Jeder der beiden Prozesse wartet nun auf den jeweils anderen um den nächsten Key zu locken. Das führt zu einem Deadlock.
Diese Art von Problemen sind nur sehr schwer zu lösen, weil sie selten und meist nur unter Hochlast auftreten, wenn also keine Zeit für eine ausführliche Fehleranalyse oder Backup der DB-Situation (Tabellen,Logs, usw.) vorhanden ist. Wenn man verstanden hat, wie die Situation zustandegekommen ist, kann man sie die Reihenfolge der Key-Locks verhindern.
So wie ich die meisten Transaktionen in OrderSprinter verwende, bestimmt die Reihenfolge der Zugriffe auf die Tabellen vermutlich auch die Reihenfolge der Locks innerhalb der Transaktionen. Wenn es eine bestimmte Stelle im Source-Code gibt, die immer wieder zu den Deadlocks führt, wäre ich bereit, mir die genauer anzuschauen und ggfs. zu verbessern. Ansonsten muss ich leider eingestehen, dass mir die schlicht die Zeit dafür fehlt, dass genauer zu investigieren.
Gruß,
Stefan
Hallo,
zunächst einmal zum letzten Punkt: Wenn [b]Performance[/b]-Daten nicht eingefügt werden können, hat das überhaupt keinen Einfluss auf die Funktionsweise der Software. Es fehlt dann nur ein Messpunkt der Daten zur Performancemessung, wie sie in in der Statistikansicht eingesehen werden können.
Aber nun zum eigentlichen [b]Deadlock[/b]-Problem. In der Software verwende ich Transaktionen für bestimmte Aktionen. Transaktionen können als eine logische Einheit betrachtet werden, weil sie den Datenbestand nach fehlerfreier und vollständiger Ausführung in einem konsistenten Zustand hinterlassen. Transaktionen werden also entweder vollständig und fehlerfrei oder gar nicht ausgeführt. Wenn man aber stets nur einem Prozess bzw. Verbindung Schreibberechtigung zu erteilt und ansonsten die gesamte Datenbank für alle anderen Prozesse einzufriert, reduziert man die Leistungsfähigkeit und das kann bei vielen gleichzeitigen Zugriffen bis zur Unbenutzbarkeit führen. Aus dem Grund gibt es verschiedene Stufen des Isolierung bei Transaktionen. Leider kann es dann aber bei vielen gleichzeitigen Zugriffen immer passieren, dass es zu einem Deadlock kommt: zwei Prozesse warten jeweils auf den anderen, um fortzufahren.
Beispiel:
[code]Verbindung 1: lockt key(1), lockt key(2);
Verbindung 2: lockt key(2), lockt key(1);[/code]
Wenn nun beide Prozesse gleichzeitig ausgeführt werden, wird über Verbindung 1 der (1) gelockt, über Verbindung 2 der (2). Jeder der beiden Prozesse wartet nun auf den jeweils anderen um den nächsten Key zu locken. Das führt zu einem Deadlock.
Diese Art von Problemen sind nur sehr schwer zu lösen, weil sie selten und meist nur unter Hochlast auftreten, wenn also keine Zeit für eine ausführliche Fehleranalyse oder Backup der DB-Situation (Tabellen,Logs, usw.) vorhanden ist. Wenn man verstanden hat, wie die Situation zustandegekommen ist, kann man sie die Reihenfolge der Key-Locks verhindern.
So wie ich die meisten Transaktionen in OrderSprinter verwende, bestimmt die Reihenfolge der Zugriffe auf die Tabellen vermutlich auch die Reihenfolge der Locks innerhalb der Transaktionen. Wenn es eine bestimmte Stelle im Source-Code gibt, die immer wieder zu den Deadlocks führt, wäre ich bereit, mir die genauer anzuschauen und ggfs. zu verbessern. Ansonsten muss ich leider eingestehen, dass mir die schlicht die Zeit dafür fehlt, dass genauer zu investigieren.
Gruß,
Stefan