AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Transaktion innerhalb Transaktion...IBDAC
Thema durchsuchen
Ansicht
Themen-Optionen

Transaktion innerhalb Transaktion...IBDAC

Ein Thema von haentschman · begonnen am 3. Feb 2012 · letzter Beitrag vom 3. Feb 2012
Antwort Antwort
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#1

Transaktion innerhalb Transaktion...IBDAC

  Alt 3. Feb 2012, 09:20
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Moin alle...

ich habe ein DBFramework gebastelt was den kompletten Zugriff auf die DB kapselt. Von außen kann ich eine Transaktion erzeugen, committen oder zurücknehmen. Die Transaktion wird als privates Feld des DB Frameworks verwaltet und den Querys zugeordnet.
Bei einfachen Objekten kein Problem. Ich kann von außen steuern wieviele und verschiedene Objekte in einer Transaktion laufen. Jetzt gibt es aber auch Objekte welche in verschiedene Tabellen schreiben. Dazu hatte ich schon in der jeweiligen Prozedure eine Transaktion für das Objekt gemacht.

Wie kann ich eine "globale Transaktion" erzeugen und innerhalb dieser eine zusätzliche laufen lassen. Im Prinzip ist die Frage welche Transaktion ich welcher Query zuordne.

Mögliche Lösung:
Unterscheidung im DB ob FTransaction nil ist und entsprechend die von außen erzeugte Transaktion nutzen oder die innerhalb der Prozedur erzeugte. Ist das sauber ?

Zum Verständnis:
Wenn ich nur 1 einfaches Objekt dem DB Framework übergebe brauche ich von außen keine Transaktion. Wenn ich eine Liste abarbeite hätte ich gern die ganze Liste in einer Transaktion. Deshalb die externe Erzeugung.

Danke für Info´s
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Transaktion innerhalb Transaktion...IBDAC

  Alt 3. Feb 2012, 09:52
hi,

schwer zu beantworten, wenn man nicht weiß wie dein Framework aufgebaut ist.

An der Stelle die entscheidet bzw. weiß dass Object A in mehrere Tabellen schreibt, müsste entweder eine neue Transaction erzeugen oder eine aus einem Pool holen.

Diese würde ich dann an die entsprechende Speicherfunktion als Parameter übergeben:

Delphi-Quellcode:
procedure SaveData(ATransaction:TIBTransaction=nil);
begin
....
end;
Und wenn ATransaction<>NiL dann diese Transaction nehmen - ohne abschließendes COmmit. Das muss dann außerhalb passieren. Zumindest fällt mir auf die schnelle nichts sinnvolleres ein...

Grüße
  Mit Zitat antworten Zitat
exilant

Registriert seit: 28. Jul 2006
134 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Transaktion innerhalb Transaktion...IBDAC

  Alt 3. Feb 2012, 10:32
Also ich mache es in meinem DBOobjekt ähnlich: Ich setze ein Flag (fInTransaction=boolean) und erzeuge eine "objektglobale" Transaktion. Alle ab jetzt vom DBObjekt erzeugten querys/sqlcommands bekommen das "objektglobale" Transaktionsobjekt zugewiesen bis ich sowas wie DBObjekt.commit oder DBObjekt.rollback mache.Dort wird fInTransaction" wieder auf FALSE gesetzt und die Transaktion beendet. Ist das Objekt nicht "InTransaction" dann bekommt jedes erzeugte query/command seine eigene Transaktion. Die wird dann per default im Destruktor commited und freigegeben. Zusätzlich kann ich auch noch trotz gesetztem InTransaction Querys/Commands mit eigenen Transaktionen erzeugen, das benötige ich aber nicht wirklich, wie sich herausgestellt hat. Klappt seit Jahren.
Anything, carried to the extreme, becomes insanity. (Exilant)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#4

AW: Transaktion innerhalb Transaktion...IBDAC

  Alt 3. Feb 2012, 12:25
Danke für Eure Anteilnahme...

Es gestaltet sich wahrscheinlich einfacher als gedacht. Folgendermaßen habe ich es gelöst:
einfaches Objekt (Daten für mehrere Tabellen):
- keine Transaktion von außen
- in der Save Prozedur wird eine Transaktion erzeugt und der Query zugeordnet, Commited oder zurückgenommen.

Liste (Objekte mit Daten für mehrere Tabellen)
- in der Connection eine Transaktion starten (Quasi global für die Verbindung)
- Abarbeitung wie einfaches Objekt
- die "globale" Transaktion Commiten oder zurücknehmen.

...so sollte es eigentlich gehen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#5

AW: Transaktion innerhalb Transaktion...IBDAC

  Alt 3. Feb 2012, 13:24
IIRC habe ich das mal so gemacht: sowohl Objekte als auch Listen stammen von einer gemeinsamen Vorfahrklasse ab. Diese besitzt eine Klassenvariable ExplicitTransaction. Soll eine Liste in einer Transaktion abgearbeitet werden, setzt sie diese auf true, arbeitet und setzt sie anschließend zurück. Die Objekte werten die Variable aus und starten bei false selbst eine Transaktion. Das ist vielleicht nicht sonderlich schön, hat aber funktioniert.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


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 03: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