Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Transaction-Management (https://www.delphipraxis.net/121947-transaction-management.html)

smudo 7. Okt 2008 13:07

Datenbank: Interbase/Firebird • Version: 6.2/2.0 • Zugriff über: IBX

Transaction-Management
 
Ist-Analyse: Wir benutzen Datenzugriffsklassen welche auf eine DB-Connection und eine dazugehörige Transaction zeigen. Nachteil: Alle Klassen nutzen die selbe Transaktion. Das wirkt sich negativ aus, wenn beispielsweise über COM auf das Programm zugegriffen wird, da keine getrennte Transactionsteuerung möglich ist.

Ziel: Die Datenzugriffsklassen sollen aus einem Transactions-Pool eine freie Transaction zugewiesen bekommen, sodass eine getrennte Transaction-Steuerung für unterschiedliche Prozesse möglich wird.

Eine Möglichkeit wäre das Zuweisen einer Transactionreferenz beim Create einer Klasse. Die oberste Klasse bekommt über einen Manager beim Create eine freie Transaction zugewiesen. Jede weitere durch diese Klasse erzeugte Datenzugriffsklasse bekommt diese Referenz weitergegeben.

Problem: Es wäre ein kaum zu bewältigender Aufwand, das Create umzustellen. Es müsste der Constructor jeder Klasse angepasst werden, sowie jeder Aufruf des Constructors geändert werden. Gibt es eine andere Möglichkeit, dieses Problem zu lösen?

Vielen Dank im Voraus
René

mquadrat 7. Okt 2008 13:46

Re: Transaction-Management
 
Wie referenziert ihr denn eure Transaction? Wie wollt ihr die Bereiche, die auf die gleiche Transaction gehen sollen kennzeichnen bzw. die Bereiche, die unterschiedliche verwenden sollen trennen?

smudo 7. Okt 2008 13:55

Re: Transaction-Management
 
Vielen Dank, dass Du meine Fragestellung nochmal auf 2 Zeilen gekürzt hast :zwinker:
Wie geschrieben: Die Transaction soll aus jeder Datenzugriffsklasse referenziert werden. Der zuerst erzeugten Klasse wird diese Referenz über einen Manager zugewiesen. Diese Referenz soll dann an jede von dieser Klasse erzeugten Klasse weitergegeben werden.

mquadrat 7. Okt 2008 14:07

Re: Transaction-Management
 
Also wenn ich das richtig verstehe habt ihr irgendwo eine globale(?) Variable für eure Transaction und auf die greifen alle Klassen zu? Oder liegt die auf nem DM?

Es läuft also derzeit eine Instanz der Anwendung und alles greift auf die gleiche Transaction zu. Zukünftig soll dann die erste erstellte Datenklasse sich ne Transaction schnappen und an die "children" weitergeben?

Gibt es irgendwelche sonstigen Informationen, die ihr durch die Klassen durchschleift? Also irgendwas an dem man erkennen könnte, dass sie zusammen gehören?

smudo 7. Okt 2008 14:46

Re: Transaction-Management
 
Die Transaction liegt auf einem DM.

Mitgeschliffen wird momentan leider nichts.

Blup 7. Okt 2008 16:33

Re: Transaction-Management
 
Ein möglicher Ansatz für Anwendungsfälle, die mit einer eigenen Transaktion arbeiten sollen:

Die Datenmodule werden nicht über eine globale Variable referenziert, sondern jeder Anwendungsfall erzeugt sich bei Bedarf ein fachliches Transaktionsobjekt und fordert benötigte Datenmodule von diesem an. Das Transaktionsobjekt erzeugt und verwaltet intern z.b. eine IBX-Transaction und die Datenmodule. Wird ein Datenmodul erzeugt, wird die IBX-Transaction über Components jeder Komponente zugewiesen. Bei Freigabe des Transaktionsobjekts werden auch alle Datenmodule freigegeben (alternativ ist auch ein Pool für Datenmodule denkbar).

squetk 7. Okt 2008 17:00

Re: Transaction-Management
 
Zitat:

sondern jeder Anwendungsfall erzeugt sich bei Bedarf ein fachliches Transaktionsobjekt und fordert benötigte Datenmodule von diesem an
Das will smudo ja - ich habe das so verstanden, dass er dieses Transactionsobject jeder Datenzugriffsklasse mitgeben will, aber nicht den Constructor anpassen möchte, um sie durchzuschleifen.

Die Frage ist, ob man das Transaktionsobject oder eine zuständiges Managerobject z.B. anhand der Thread-ID innerhalb der Datenzugriffsklasse ermitteln kann. Wobei es so zu sein scheint, dass die COM-Automatisierung nicht in einem Extra-Thread läuft - oder ist dies eine Einstellungssache?

Ich denke mal jeder Thread benötigt im Normalfall nur eine Transaction.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:53 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