Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#9

AW: Datensatz Sperre MySQL

  Alt 8. Mai 2023, 09:56
Wenn ich das recht verstanden habe, bedeutet die Fehlermeldung, dass (mindestens) zwei Änderungen an dem gleichen Datensatz durchgeführt werden soll(t)en. Wenn es eine Sperre gibt, so kann es sich hierbei um einen Vorgang von Millisekunden handeln. Wenn Du also die Fehlermeldung bekommst und in der DB nachschaust, kann die Sperre schon längst wieder aufgehoben sein. Die Chance die konkrete Sperre zu "sehen" tendiert daher zuweilen gegen 0.

Andererseits: Wenn alle Felder beim Update geprüft werden, kann diese Fehlermeldung auch auftreten. Das beutet aber nicht, dass es tatsächlich eine Sperre gibt, sondern nur: Der Datensatz ist in der DB jetzt anders als er zum Zeitpunkt, zu dem die Daten gelesen wurden, anders war. So 'ne richtige Sperre liegt da nicht vor, sondern eine Fehlermeldung, die textlich eher irreführend sein könnte.

Ursache ist in der Regel, dass tatsächlich der bereffende Datensatz geändert wurde.

In Deinem Szenario kannst Du aber auch selbst der sperrende User sein.
Es wird im Grid was geändert. Was ich nicht weiß und das Du mal prüfen solltest: Wird nur der gerade geänderte Datenatz in Richtung DB geschickt oder eventuell alle im Grid angezeigten Sätze? Hierdurch könnten eventuell Inkonsistenzen zwischen den Daten im Grid und der DB entstehen. Wäre zwar extrem unangenehm (und sicherlich in Richtung (gravierender) Bug einzuordnen), aber absolut ausschließen würd' ich das erstmal nicht.

Versuchter Workaround: Wenn im Grid ein Satz geändert wurde: Nach dem Post ein Query.Refresh einbauen, so dass die Daten neu aus der DB gelesen werden. Ist performenstechnisch sicherlich suboptimal, aber um zu prüfen, ob der Fehler dann weg ist, sicherlich erstmal geeignet. Wird der Fehler so behoben, kannst Du dann zumindest etwas gezielter weiter nach der eigentlichen Ursache suchen.

Gibt es auf der Datenbank irgendwelche Trigger, die ggfls. für veränderte Daten zuständig sein könnten, aber nicht grundsätzlich Daten ändern, sondern nur unter bestimmten Bedingungen, so dass der Fehler nicht immer auftreten muss?

Bei dem Klick im Grid wird die Änderung (vermutlich) nicht sofort Richtung Datenbank geschickt, sondern erst, wenn Post aufgerufen wird. Das passiert, wenn man z. B. in 'nem DBNavigator den entsprechenden Button drückt oder wenn man den Datensatz wechselt.
Kannst Du sowas in Deinem Programm mal machen?
Erst Checkbox klicken, dann explizit ein Post aufrufen, dann den Datensatz wechseln und dann die zweite Checkbox klicken? Tritt der Fehler dann immernoch (sporadisch) auf?

Geändert von Delphi.Narium ( 8. Mai 2023 um 10:39 Uhr) Grund: Schreib- und Grammatikfehler
  Mit Zitat antworten Zitat