Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Programm 2x offen=falsche Daten (https://www.delphipraxis.net/146767-programm-2x-offen%3Dfalsche-daten.html)

Teekeks 26. Jan 2010 21:15

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

mkinzler 26. Jan 2010 21:27

Re: Programm 2x offen=falsche Daten
 
Die beiden Verbindungen laufen ja in verschiedenen Transaktionen. Vermutlich wir nach dem Insert kein Commit ausgeführt.

Teekeks 26. Jan 2010 21:32

Re: Programm 2x offen=falsche Daten
 
Doch doch, es wird ein Insert ausgeführt.
Die Daten landen ja auch in der Datenbank...

mkinzler 26. Jan 2010 21:34

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.

alex517 26. Jan 2010 21:40

Re: Programm 2x offen=falsche Daten
 
Zitat:

Zitat von mkinzler
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.

Firebird kennt kein "dirty-read".
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

Teekeks 26. Jan 2010 21:42

Re: Programm 2x offen=falsche Daten
 
es wird ja auch ein commit hinterher geschickt...

haentschman 26. Jan 2010 22:01

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.

Teekeks 26. Jan 2010 22:12

Re: Programm 2x offen=falsche Daten
 
Zitat:

Zitat von haentschman
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.

Sowas gibt es hier irgendwie nicht... Bei welcher Komponente soll das sein?

Luckie 26. Jan 2010 22:16

Re: Programm 2x offen=falsche Daten
 
Guck mal in den Datenbakeinstellungen. Zumindest ich würde es da suchen.

hoika 27. Jan 2010 07:30

Re: Programm 2x offen=falsche Daten
 
Hallo,

Zitat:

Firebird kennt kein "dirty-read".
Besser ist das auch.


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

haentschman 27. Jan 2010 08:01

Re: Programm 2x offen=falsche Daten
 
Zitat:

Sowas gibt es hier irgendwie nicht...
ZConnection.TransactionIsolationLevel

Blup 27. Jan 2010 08:50

Re: Programm 2x offen=falsche Daten
 
zeitlicher Ablauf etwas übersichtlicher:
Code:
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
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.

Teekeks 27. Jan 2010 08:54

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.

alex517 27. Jan 2010 12:31

Re: Programm 2x offen=falsche Daten
 
Zitat:

Zitat von hoika
Das Problem ist, dass Programm 2 (Select)
erst eine neue Transaktion starten muss,
bevor es die Daten von Programm (nach dessen Commit) sehen kann.

Das ist nicht ganz korrekt.
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 22:40 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