AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Nicht sichtbare Datensätze
Thema durchsuchen
Ansicht
Themen-Optionen

Nicht sichtbare Datensätze

Ein Thema von TurboMagic · begonnen am 16. Jun 2024 · letzter Beitrag vom 16. Jun 2024
Antwort Antwort
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#1

Nicht sichtbare Datensätze

  Alt 16. Jun 2024, 16:47
Datenbank: Firebird • Version: 5.0 • Zugriff über: FireDAC
Hallo,

ich habe eine Firebird 5.0 Datenbank die mittels Delphi 12.1 FireDAC angesprochen
wird. Ich habe nur eine Connection dort hin und noch eine weitere von einem DB
Verwaltungstool "SQL Manager Lite".

In einem Ablauf soll ein gewisser Select (left join) die Summe aller Beträge
aller Zeilen die eine bestimmte numerische Transaktionsnummer haben, die eben
erst den betreffenden Einträgen zugewiesen wurde (vorhger war diese Null).

Im aktuellen Beispielfall gibt es genau 2 Datensätze die da zu summieren sind.
Nur liefert der Select im Programm nur den einen Fall (der select hat in der
Where Bedingung eine Prüfung auf diese spezifische transaktionsnummer), also
eine zu niedrige Summe.

Führe ich den selben select paralell im DB Tool aus liefert er kein Ergebnis bzw.
wenn ich in der Where Bedingung die Prüfung auf die Transaktionsnummer durch
"is Null" ersetze liefert er das gewünschte Ergebnis.

1. Bevor ich diese Transaktionsnummer in alle Tabellen schreibe Starte ich eine Transaktion.

2. Ich habe auch schon versucht vor dem Starten der Transaktion
FSQLConnection.TxOptions.Isolation := xiDirtyRead; zu setzen.

3. Ich habe auch schon versucht vor der SQL Abfrage CommitRetaining; aufzurufen.

Leider alles bisher ohne Erfolg.
Hat noch jemand eine Idee?
Grüße
TurboMagic
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#2

AW: Nicht sichtbare Datensätze

  Alt 16. Jun 2024, 17:31
Zitat von TurboMagic:
die eben erst den betreffenden Einträgen zugewiesen wurde (vorhger war diese Null).
Erfolgt danach ein Commit (bevor die Transaktion für das SQL gestartet wird)?
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#3

AW: Nicht sichtbare Datensätze

  Alt 16. Jun 2024, 17:35
Hallo,

1. Transaktion starten

2. Den Datensätzen die Transaktionsnummer per Update zuweisen.

3. Die Abfrage starten die nicht so richtig will...

Was noch vorkommen könnte wäre zwischen 1. und 2. eine Buchung von Datenstätzen die selbst
StartTransaction und Commit macht, aber im Beispiel ist das nicht der Fall, da der aktuelle
Testfall einfacherer Natur ist.

Grüße
TurboMagic
Grüße
TurboMagic

Geändert von TurboMagic (16. Jun 2024 um 17:43 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#4

AW: Nicht sichtbare Datensätze

  Alt 16. Jun 2024, 17:56
Ist sichergestellt, dass das Update und das Select in einer Transaktion stattfinden? Laut Beschreibung von Dir müsste dem so sein. Könnte es sein dass das Update eine eigene Transaktion startet, die aber nicht mit Commit beendet wird?

1. Start Transaktion

2a. Start einer weiteren Transaktion
2b. Den Datensätzen die Transaktionsnummer per Update zuweisen.

3. Die Abfrage starten die nicht so richtig will...

Sprich: Gibt es da irgendwo einen (nicht offensichtlichen) Seiteneffekt?

Bitte mal ausprobieren:

1. Start Transaktion
2. Den Datensätzen die Transaktionsnummer per Update zuweisen.
3. Commit der Transaktion

4. Start Transaktion
5. Die Abfrage starten die nicht so richtig will...

Klappt es dann?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#5

AW: Nicht sichtbare Datensätze

  Alt 16. Jun 2024, 18:09
Ich verstehe das so: Deine Anwendung startet eine Transaction und macht das UPDATE. Das externe Tool macht danach ein SELECT und sieht die Änderung nicht. Was mir hier noch fehlt, ist das Transaction-Verhalten des Tools. Wird bei jedem SELECT eine neue Transaction aufgemacht (mit welchem Isolation-Level?) oder muss man das manuell regeln?

2. Ich habe auch schon versucht vor dem Starten der Transaktion
FSQLConnection.TxOptions.Isolation := xiDirtyRead; zu setzen.
Da wirkt sich aber nur auf das aus, was diese Connection zu sehen bekommt, nicht was andere zu sehen bekommen. Wenn das Tool die Änderungen sehen soll, muss es selbst die entsprechende Isolation einstellen. Vielleicht kann man den Isolationslevel ja bei dem Tool einstellen.

3. Ich habe auch schon versucht vor der SQL Abfrage CommitRetaining; aufzurufen.
Auch das erfordert zumindest den Start einer neuen Transaction in dem Tool. Andernfalls bleibt das Ergebnis dasselbe - zumindest wenn kein Read-Dirty erfolgt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#6

AW: Nicht sichtbare Datensätze

  Alt 16. Jun 2024, 18:34
In Bezug auf das externe Tool ist das richtig.

Das Problem ist nur, dass das Select in dem Programm, welches das Update durchführt, ein falsches Ergebnis liefert.

Das Programm sieht quasi die von sich selbst gemachten Änderungen nicht und liefert daher nicht das erwartete Ergebnis, obwohl Update und Select (vermutlich, höchstwahrscheinlich, eigentlich so erwartet) in einer Transaktion ausgeführt werden.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#7

AW: Nicht sichtbare Datensätze

  Alt 16. Jun 2024, 18:40
Ja, Delphinarium hat recht.

Das externe Tool ist da nicht wirklich relevant, aber eben der Versuch da einen unabhängigen Blick drauf zu werfen.
Bei dem Tool gibt es für die Verbindung eine zentrale Einstellung der Transaktionssichtbarkeit und die steht auf
ReadCommitted. Siehe Screenshot.

Den vorgeschlagenen Test werde ich noch machen. Ich kann auch in meine Kapselung der StartTransaction Methode
einen breakpoint setzen, nur würde das halt keine impliziten StartTransaction Aufrufe oder solche welche die
Methode umgehen zeigen.
Miniaturansicht angehängter Grafiken
dbtool.png  
Grüße
TurboMagic
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#8

AW: Nicht sichtbare Datensätze

  Alt 16. Jun 2024, 18:54
Hm, nochmal ein ganz anderer "Twist":
momentan breche ich beim Testen die Sitzung ab, wenn ich in der Routine die das nicht richtig
funktionierende Select ausführt merke, dass das falsche Ergebnis raus kommt.

Somit bleiben die Datensätze welche diese Transaktionsnummer erhalten sollten auf dem
alten Stand. d.h. schaue ich mir diese mit dem externen Tool an steht deren Transaktionsnummer
immer noch auf Null.

Führe ich mein Programm erneut aus, versucht es diese Transaktionsnummer erneut zu vergeben.
Muss mal Daten bereinigen und den Test mit dem COmmit durchführen, erfolgt aber erst später.
Grüße
TurboMagic
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#9

AW: Nicht sichtbare Datensätze

  Alt 16. Jun 2024, 20:41
Hallo,

es wird noch verworrener!
Ich habe den Test jetzt ausgeführt, hat aber wieder nur das falsche Ergebnis gebracht.

Dann habe ich jetzt mal eine Routine geschrieben, der alle Datensätze der Tabelle, die
später zur Summe beiträgt, welche die zu setzende TransaktionsID haben, in ein Log schreibt.
Die eigentliche ID des Datensatzes (also nicht die TransaktionsID) und den Betrag.

Und siehe da, das liefert einen Datensatz mit einer höheren Datensatz ID als die höchste
mir im externen DB Tool angezeigte und einen Betrag von -10 €, der genau die +10 € um die
das Ergebnis später falsch ist mindert.

Ich versuche gleich mal dne Satz zu löschen und erneut zu testen.
Interessant wäre es jedoch herauszubekommen warum dieser Datensatz im externen DB Tool nicht
angezeigt wird! Trotz Commits dort und ANzeige aktualisieren usw.
Grüße
TurboMagic
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#10

AW: Nicht sichtbare Datensätze

  Alt 16. Jun 2024, 21:13
Hallo,

ok, Rolle rückwärts! Ich weiß jetzt wo mein Denkfehler ist.
Ist nicht in der Datenbank etc. sondern in der Logik der Abwicklung.
Bin jetzt wieder auf dem richtigen Gleis, wenn auch noch nicht ganz am
Ziel aber das sollte nun werden.

Danke!
Grüße
TurboMagic
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz