Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Transaktion nicht komplett zurückfahren (https://www.delphipraxis.net/64124-transaktion-nicht-komplett-zurueckfahren.html)

Hansa 27. Feb 2006 20:53

Datenbank: FB 1.5 • Zugriff über: FIBplus

Transaktion nicht komplett zurückfahren
 
Hi,

wie der Titel schon sagt : ich will eine Transaktion bis zu einem gewisssen Punkt (bzw. gesteuert auf diverse) zurückfahren. Der User kann an bestimmten Punkten etwas ändern, ohne komplett alles wegwerfen zu müssen. Wie weit er jetzt zurückgeht, das ist mir egal. 8) Je weiter zurück um so mehr Arbeit für den. :mrgreen: Das geht ja auch mit FB 1.5. Ich müßte ja so was ähnliches wie nummerierte Breakpoints setzen und die Transaktion dann eben nur bis zur entsprechenden Stelle zurückfahren. Aber wie realisiere ich das mit Delphi programmgesteuert ? Geht das überhaupt ?

Aenogym 28. Feb 2006 08:53

Re: Transaktion nicht komplett zurückfahren
 
hi hansa,

ich bin zwar kein experte auf dem gebiet, aber mal so als gedanke: du könntest vielleicht deine transaktion verschachteln.
also innerhalb deiner transaktion werden bestimme statements wieder zu einer transaktion zusammengefasst und wenn was schiefgeht, könntest du an der stelle reagieren (zB mit einem commit der eltern-transaktion).

aeno

mkinzler 28. Feb 2006 08:59

Re: Transaktion nicht komplett zurückfahren
 
Ich glaube das war nicht Hansa's Problem, da FB seit 1,5 ja SQL-99 Savepoints kann ( also ein Zerlegung einer Transaktion in mehrere "Teil"-Transaktionen, die für sich comitted bzw. rollback'ed weden können).
Er interssiert sich eher, wie er das Ganze, bicht nur in SPs nutzen kann, sondern das von Delphi aus steuern kann.

Frank Borland 28. Feb 2006 10:37

Re: Transaktion nicht komplett zurückfahren
 
die zu verwendenden Komponenten (z.B ibobjects) müssen die entsprechenden Funktionen der Firebird- API benutzen. Suche mal bei FIBplus nach CommitRetaining, RollbackRetaining und Konsorten.

Gruß


Malte

Hansa 28. Feb 2006 12:42

Re: Transaktion nicht komplett zurückfahren
 
Irgendwie wird das auch ohne diese Savepoints gehen, aber nicht so schön und einfach. :-D Beispiel : Für eine Rechnung gebe ich viele Artikel ein. Gleichzeitig sollen Rückgaben gutgeschrieben werden. Bei den Rückgaben verhaue ich mich total (z.B. völlig falsche Rückgabe eingegeben, wegen verwechseltem Kunden) 8) Nun will ich alles rückgängig machen. Die Lieferung allerdings nicht !

Das Bsp. ist fiktiv und in der Realität noch verschachtelter. Mein Gedanke ist nun der : am Anfang direkt Transaction starten. An dem Punkt, an dem die Eingabe der Rückgaben erfolgt setze ich einen Savepoint. Und in dem konstruierten Fall wäre ich mit einem Rollback zurück bis zum Savepoint fein raus und bräuchte lediglich die Rückgabe neu einzugeben. Und der Witz an der Geschichte wäre ja, daß ich die Transaktionen 1:1 im Programm abbilden könnte. Für die Rückgaben bräuchte man nur ein eigenes Form und im FormShow wird der Savepoint gesetzt. Der Transaktions-Stand der DB würde dann überhaupt nicht mehr interessieren ! Im Source wäre alles klar zu erkennen. Wenn das so genial gehen sollte, dann mache ich das auch so.

Habe gedacht, jemand würde so was schon in der Praxis einsetzen. Ja, muß mir tatsächlich mal das Rollback genauer ansehen. Hätte ich das in FB zu integrieren, ich würde dem Rollback einen Parameter für Savepoint mitgeben. Mal suchen.

Edit : Tja, manchmal geht es schneller und zweitens, als man denkt. :lol: Die haben neue Prozeduren gemacht. Ähnlich wie ich geahnt habe :

RollbackToSavePoint (SavePointName) und
SetSavePoint (SavePointName)

Schwieriges / neues Thema und trotzdem schnell gelöst. *freu*

Hansa 2. Mär 2006 12:10

Re: Transaktion nicht komplett zurückfahren
 
Moin,

das ganze geht wie gewünscht. An geeigneter Stelle setzt man mit
Delphi-Quellcode:
SetSavePoint (NAME);
einen Savepoint. Genau bis zu dieser Stelle wird bei Bedarf alles mit
Delphi-Quellcode:
RollBackToSavePoint (NAME);
rückgängig gemacht. Für NAME natürlich keinen FB Identifier verwenden ! Von da an gehts dann wieder weiter und kann committed oder mit Rollback auch vollständig zurückgenommen werden. Der Rest steht in der Firebird Referenz. Geht man z.B. nicht auf den letzten Savepoint zurück, sondern auf den vorletzten, so ist auch der Letzte weg !

Allerdings ist das nun erstmalig ein konkreter Fall, daß IB <> FB und IBX <> ??? Denn Interbase unterstützt das alles erst ab 7.1 und in IBX ist auch nichts davon zu sehen (vielleicht gibts ein Update). Mit reinem Delphi 7 ist das so wohl nicht möglich. Oder es heißt ganz anders. In IBTransaction ist jedenfalls nichts zu finden.


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