AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?
Thema durchsuchen
Ansicht
Themen-Optionen

DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?

Ein Thema von RSE · begonnen am 11. Jul 2012 · letzter Beitrag vom 13. Jul 2012
Antwort Antwort
Seite 1 von 2  1 2      
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#1

DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?

  Alt 11. Jul 2012, 17:07
Datenbank: Firebird • Version: 2.5 • Zugriff über: dbExpress
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?
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.198 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?

  Alt 11. Jul 2012, 17:42
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#3

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?

  Alt 11. Jul 2012, 19:48
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.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#4

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?

  Alt 11. Jul 2012, 20:30
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.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#5

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?

  Alt 11. Jul 2012, 22:08
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.

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.

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.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?

  Alt 12. Jul 2012, 00:22
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#7

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?

  Alt 12. Jul 2012, 09:29
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?
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?

  Alt 12. Jul 2012, 10:17
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#9

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?

  Alt 12. Jul 2012, 10:37
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.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."

Geändert von RSE (12. Jul 2012 um 10:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: DBExpress: Wie mehrere Transaktionen gleichzeitig handeln?

  Alt 12. Jul 2012, 10:58
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.

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.

Hier ist dringender Dokumentationsbedarf und offenbar auch Nachbesserungsbedarf seitens Embarcadero vorhanden.
Das sehe ich auch so!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:41 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