Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBExpress: Wie mehrere Transaktionen gleichzeitig handeln? (https://www.delphipraxis.net/169315-dbexpress-wie-mehrere-transaktionen-gleichzeitig-handeln.html)

RSE 11. Jul 2012 16:07

Datenbank: Firebird • Version: 2.5 • Zugriff über: dbExpress

DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?
 
Hallo,

ich versuche mich gerade in die dbExpress-Komponenten unter Delphi XE Enterprise einzulesen. TSQLConnection hat eine Eigenschaft MultipleTransactionsSupported, die stark darauf schließen lässt, dass man mit mehreren Transaktionen gleichzeitig arbeiten kann. Mit TSQLConnection.StartTransaction und TCustomSQLDataSet.TransactionLevel könnte ich mir ungefähr vorstellen, wie das funktionieren könnte, aber TSQLConnection.StartTransaction ist deprecated. Der Ersatz ist TSQLConnection.BeginTransaction. Dafür ist es mir allerdings seit Stunden nicht gelungen herauszubekommen, wie mehrere Transaktionen gehandelt werden.

Beispielfall: Ich habe 2 Fenster, die gleichzeitig offen sein können, in jedem soll eine eigene Transaktion durchgeführt werden (die offen bleibt, während der User Daten eingibt - bad practice, aber anschaulich) und diese Transaktionen sollen über die gleiche Verbindung laufen. Wie ist das zu bewerkstelligen?

Bernhard Geyer 11. Jul 2012 16:42

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?
 
Zitat:

Zitat von RSE (Beitrag 1174348)
Beispielfall: Ich habe 2 Fenster, die gleichzeitig offen sein können, in jedem soll eine eigene Transaktion durchgeführt werden (die offen bleibt, während der User Daten eingibt - bad practice, aber anschaulich) und diese Transaktionen sollen über die gleiche Verbindung laufen. Wie ist das zu bewerkstelligen?

Transaktionen sollte zeittechnisch so kurz wie möglich sein. Deshalb ist es absolut zu vermeiden ein Transaktion zu starten wenn ein Formular geöffnet wird.
Führe die Transaktion mit allen Daten durch wenn das Formular geschlossen bzw. "Applied" wird. Dann brauchst du auch nur eine gleichzeitige Transaktion.

RSE 11. Jul 2012 18:48

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?
 
Mir ist bekannt, dass das ein schlechtes Beispiel ist, aber es ist anschaulich. Ich möchte einfach wissen, wie man eine zweite unabhängige Transaktion über die gleiche Connection mit dbExpress handelt. Stelle dir vor, die zwei Formulare laufen in unterschiedlichen Threads und beide werden gleichzeitig bestätigt (wieder schlechtes Beispiel, bestimmt braucht jeder Thread seine eigene Connection) oder irgendwas anderes, bei dem man nicht sicher sein kann, dass nicht schon eine andere Transaktion gerade am Laufen ist. Ich möchte nicht jedesnal prüfen, ob vielleicht schon was läuft und dann überlegen wie ich diesen seltenen Fall abfangen kann... Auch während der Transaktion können Windows Messages verarbeitet werden, die u.U. eine weitere Transaktion triggern und dann will ich es nicht extra abfangen müssen.

mjustin 11. Jul 2012 19:30

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?
 
Zitat:

Zitat von RSE (Beitrag 1174348)
TSQLConnection hat eine Eigenschaft MultipleTransactionsSupported, die stark darauf schließen lässt, dass man mit mehreren Transaktionen gleichzeitig arbeiten kann.

Vermutlich nur wenn sie den Wert True hat.

TSQLConnection.BeginTransaction arbeitet mit einem TDBXTransaction Objekt, und jede Transaktion hat eine eigene Instanz, damit können im Prinzip gleichzeitige Transaktionen auf der gleichen Connection ausgeführt werden.

Verschachtelte Transaktionen können verwendet werden, wenn SupportsNestedTransactions true ist. Wenn ein Unterformular eine weitere Transaktion startet während die Mainform bereits eine begonnen hat, ist wahrscheinlich Support für verschachtelte Transaktionen notwendig.

RSE 11. Jul 2012 21:08

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?
 
Zitat:

Zitat von mjustin (Beitrag 1174362)
Zitat:

Zitat von RSE (Beitrag 1174348)
TSQLConnection hat eine Eigenschaft MultipleTransactionsSupported, die stark darauf schließen lässt, dass man mit mehreren Transaktionen gleichzeitig arbeiten kann.

Vermutlich nur wenn sie den Wert True hat.

Logisch. Hat sie bei meiner Verbindung zu Firebird. Ich meinte dbExpress kann grundsätzlich damit umgehen.

Zitat:

Zitat von mjustin (Beitrag 1174362)
TSQLConnection.BeginTransaction arbeitet mit einem TDBXTransaction Objekt, und jede Transaktion hat eine eigene Instanz, damit können im Prinzip gleichzeitige Transaktionen auf der gleichen Connection ausgeführt werden.

Soweit war mir das klar. Wie ich das TDBXTransaction-Objekt mit einer Transaktion zu benutzen habe, ist mir auch klar. Was mir nicht klar ist: Wie kann ich eine Operation einer Transaktion zuordnen? Bei anderen Komponenten muss man bei den DataSets die Transaktion angeben, damit gehören dann die mit dem DataSet ausgeführten Operationen zu der zugeordneten Transaktion. dbExpress hat aber keine solche Eigenschaft in den DataSets.

Zitat:

Zitat von mjustin (Beitrag 1174362)
Verschachtelte Transaktionen können verwendet werden, wenn SupportsNestedTransactions true ist. Wenn ein Unterformular eine weitere Transaktion startet während die Mainform bereits eine begonnen hat, ist wahrscheinlich Support für verschachtelte Transaktionen notwendig.

Um verschachtelte Transaktionen geht es mir hier nicht. Ich redete von zwei gleichberechtigten nichtmodalen Fenstern, die nebeneinander offen sein können und deren Transaktionen unabhängig voneinander sind. Genau dazu schweigt die Hilfe leider.

Uwe Raabe 11. Jul 2012 23:22

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?
 
Zitat:

Zitat von RSE (Beitrag 1174371)
Ich redete von zwei gleichberechtigten nichtmodalen Fenstern, die nebeneinander offen sein können und deren Transaktionen unabhängig voneinander sind.

TSQLConnection.BeginTransaction liefert dir eine TDBXTransaction zurück, die du beim zugehörigen CommitFreeAndNil bzw. RollBackFreeAndNil wieder übergeben musst.

RSE 12. Jul 2012 08:29

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1174386)
Zitat:

Zitat von RSE (Beitrag 1174371)
Ich redete von zwei gleichberechtigten nichtmodalen Fenstern, die nebeneinander offen sein können und deren Transaktionen unabhängig voneinander sind.

TSQLConnection.BeginTransaction liefert dir eine TDBXTransaction zurück, die du beim zugehörigen CommitFreeAndNil bzw. RollBackFreeAndNil wieder übergeben musst.

So weit, so klar, nur bei folgendem Quelltext (untested) ist die Zuordnung Transaktion - Operation in meinen Augen nicht möglich.
Delphi-Quellcode:
TA1 := Conn.BeginTransaction;
TA2 := Conn.BeginTransaction;
DataSet1.Open;                                 // TA1
u := DataSet1.FieldByName('USER_ID').AsInteger; // TA1
DataSet1.Close;                                // TA1
DataSet2.Open;                                 // TA2
DataSet1.FieldByName('USER_ID').AsInteger := u; // TA2
DataSet2.Post;                                 // TA2
DataSet2.Close;                                // TA2
Conn.RollbackFreeAndNil(TA1);
Conn.CommitFreeAndNil(TA2);
Bitte keine neue Diskussion über den Sinn dieser Operation und die Aufteilung in 2 Transaktionen, es ist lediglich ein Beispiel zur Veranschaulichung. Ich wollte mir keine 2 Seiten Code ausdenken, um einen tatsächlichen (undurchsichtigen) Fall zu konstruieren.

Wie ist es bei obigem Quelltext möglich, die Operationen den Transaktionen zuzuordnen?

Uwe Raabe 12. Jul 2012 09:17

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?
 
Zitat:

Zitat von RSE (Beitrag 1174397)
Wie ist es bei obigem Quelltext möglich, die Operationen den Transaktionen zuzuordnen?

Ich vermute, das ist (noch) nicht vollständig implementiert. Die Hilfe sagt dazu

Zitat:

Bei der Arbeit mit mehreren Transaktionen können Sie die Transaktion, zu der eine Datenmenge gehört, dadurch angeben, dass Sie der Eigenschaft TransactionLevel den beim Aufruf dieser Methode verwendeten Transaktionsbezeichner zuweisen.
Dummerweise gibt es dieses Property aber in XE2 gar nicht mehr! Einen adäquaten Ersatz konnte ich zumindest auch nicht finden. Ich sehe hier im Moment also keine Möglichkeit, überlappende Transaktionen zu verwenden, sondern lediglich ineinander verschachtelte.

RSE 12. Jul 2012 09:37

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?
 
Das hatte ich auch gefunden, gehört zu einem als deprecated gekennzeichneten Verfahren der Transaktionssteuerung mit StartTransaction.

Edit: Wie verschachtelte Transaktionen zugeordnet werden, ist auch nicht explizit in der Hilfe gesagt. Man kann nur vermuten, dass jede Operation immer der zuletzt gestarteten und noch nicht beendeten Transaktion zugeordnet wird. Oder zählt der Zeitpunkt des Öffnens des DataSets??? Hier ist dringender Dokumentationsbedarf und offenbar auch Nachbesserungsbedarf seitens Embarcadero vorhanden.

Uwe Raabe 12. Jul 2012 09:58

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?
 
Zitat:

Zitat von RSE (Beitrag 1174412)
Das hatte ich auch gefunden, gehört zu einem als deprecated gekennzeichneten Verfahren der Transaktionssteuerung mit StartTransaction.

Deprecated ist hier irreführend - wird nicht verwendet entspricht eher der Realität.

Zitat:

Zitat von RSE (Beitrag 1174412)
Edit: Wie verschachtelte Transaktionen zugeordnet werden, ist auch nicht explizit in der Hilfe gesagt. Man kann nur vermuten, dass jede Operation immer der zuletzt gestarteten und noch nicht beendeten Transaktion zugeordnet wird. Oder zählt der Zeitpunkt des Öffnens des DataSets???

Bei überlappenden Transaktionen wird standardmäßig die erste Transaktion deaktiviert, sobald die zweite Transaktion gestartet wird, obwohl Sie das Festschreiben oder Rückgängigmachen der ersten Transaktion auf später verschieben können.

Ich interpretiere das so, daß nach einem zweiten BeginTransaction diese neue Transaktion für alle Operationen bis zum zugehörigen Commit oder Rollback bzw. einem nochmaligen BeginTransaction verwendet wird. Man kann aber das Commit oder Rollback für die alte Transaktion wohl auch irgendwann machen. Das eigentliche Handling der Transaktionen geschieht sowieso im verwendeten Treiber und ist stark von der darunterliegenden Datenbank abhängig.

Zitat:

Zitat von RSE (Beitrag 1174412)
Hier ist dringender Dokumentationsbedarf und offenbar auch Nachbesserungsbedarf seitens Embarcadero vorhanden.

Das sehe ich auch so!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr.
Seite 1 von 2  1 2      

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