![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: IBConnection und/oder Zeos
Programm 2x offen=falsche Daten
Hallo!
Ich habe hier ein Problem mit meiner Datenbank. Szenario: -2x das selbe Programm welches immer die eigenen Daten von der Datenbank holt (selbe Tabellen) -Beide sind Connectet -Das eine Programm schreibt ein INSERT (z.B.) -Beide Aktualisieren (SELECT) -Bei dem von dem das INSERT ausgeht wird alles richtig angezeigt (also der Datensatz ist da) -Bei dem anderen wird trotz SELECT der Datensatz nicht Angezeigt Ich muss mich neu zur Datenbank Connecten damit der auch dort richtig angezeigt wird. Was mache ich da falsch/ wie mach ich es richtig? Das Problem tritt bei den Zeos-Komponenten genau so auf wie bei der IBConnection Gruß Teekeks |
Re: Programm 2x offen=falsche Daten
Die beiden Verbindungen laufen ja in verschiedenen Transaktionen. Vermutlich wir nach dem Insert kein Commit ausgeführt.
|
Re: Programm 2x offen=falsche Daten
Doch doch, es wird ein Insert ausgeführt.
Die Daten landen ja auch in der Datenbank... |
Re: Programm 2x offen=falsche Daten
Der Insert vielleicht schon, wird aber auch die Tranaktion abgeschlossen (commit)? Vorher sind die Änderungen nur in der selben Transaktion oder bei dirty-read sichtbar.
|
Re: Programm 2x offen=falsche Daten
Zitat:
Es muß immer ein Commit oder wenigstens ein CommitRetaining(führt auf Dauer zu Problemen) ausgeführt werden, damit andere Transaktionen die geänderten Daten sehen können. alex |
Re: Programm 2x offen=falsche Daten
es wird ja auch ein commit hinterher geschickt...
|
Re: Programm 2x offen=falsche Daten
Guten Abend... :hi:
ich denke das Stichwort heißt Transaktion Level. Stelle mal TransactionIsolationLevel auf tiReadCommitted statt auf tiNone dann werden alle Transaktionen welche commited sind für "andere" sichtbar. |
Re: Programm 2x offen=falsche Daten
Zitat:
|
Re: Programm 2x offen=falsche Daten
Guck mal in den Datenbakeinstellungen. Zumindest ich würde es da suchen.
|
Re: Programm 2x offen=falsche Daten
Hallo,
Zitat:
Das Problem ist, dass Programm 2 (Select) erst eine neue Transaktion starten muss, bevor es die Daten von Programm1 (nach dessen Commit) sehen kann. Prog 1 Prog 2 StartTrans StartTrans Insert Select -> keine Daten Commit Select -> keine Daten Commit Select -> Daten sind sichtbar Heiko |
Re: Programm 2x offen=falsche Daten
Zitat:
|
Re: Programm 2x offen=falsche Daten
zeitlicher Ablauf etwas übersichtlicher:
Code:
In Prog2 sind nur Datenänderungen aus anderen Transaktionen sichtbar, die vor dem Start der eigenen Transaktion mit Commit freigegeben wurden. Das kann man für Spezialfälle über TransactionIsolationLevel anders einstellen, sollte man aber im Normalfall nicht.
Prog 1 Prog 2
------------------------------------------------------- StartTrans Insert/Update/Delete StartTrans Select -> unveränderte Daten Commit Select -> unveränderte Daten Commit oder Rollback StartTrans Select -> geänderte Daten sind sichtbar |
Re: Programm 2x offen=falsche Daten
Ahh, OK danke. Jetzt geht es.
Wer hätte gedacht dass man erst eine neue Transaktion starten muss... also ich nicht. |
Re: Programm 2x offen=falsche Daten
Zitat:
Das gilt nur bei Verwendung des Transaction-Isolation-Levels SNAPSHOT bzw. RepetableRead. Das sollte aber die Ausnahme sein. Normalerweise wird READ COMMITTED verwendet. Da ist es ausreichend das SQL-Statement erneut auszuführen und es werden alle Daten anderer Transaktionen die mit COMMIT bestätigt sind gesehen. Auch wenn das COMMIT nach dem Start der eigene Transaktion erfolgte. Deshalb ja auch der Name READ COMMITTED. Bei SNAPSHOT hingegen werden alle Daten anderer Transaktionen ignoriert, auch wenn diese mit COMMIT bestätigt wurden. alex |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz