Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Transaktionen bei DBExpress mit MySQL (https://www.delphipraxis.net/135705-transaktionen-bei-dbexpress-mit-mysql.html)

mannewolff 16. Jun 2009 11:32

Datenbank: MySQL • Version: 5.0 • Zugriff über: DBExpress

Transaktionen bei DBExpress mit MySQL
 
Moin.

Ich habe versucht in obiger Konfiguration eine Transaktion durchzuführen, wobei ich sowohl die Connectio in einem Modul als auch die SQL's in Fachobjekten habe:

Delphi-Quellcode:
function TFrameBestellanfrage.saveBestellposition : boolean;
var
  ...
  transaction : TDBXTransAction;
begin
  ...
  transaction := DatenModul.SQLConnection.BeginTransaction();
  try
    lastbestellposition.save();
    if neu then
    begin
       Zuordnung := TAnfrageZuBestellposition.Create();
       Zuordnung.FK_ANFRAGE := lastAnfrage.id;
       Zuordnung.FK_BESTELLPOSITION := lastbestellposition.id;
       Zuordnung.save();
       Zuordnung.Free();
    end;
    DatenModul.SQLConnection.CommitFreeAndNil(transaction);
    except
      DatenModul.SQLConnection.RollbackFreeAndNil(transaction);
  end;
  setMustSave(false);
end;
Manchmal geht es gut, manchmal bekomme ich eine Exception.

Frage: Ist der Weg denn korrekt, dann kann ich weitersuchen.

-manne

hoika 16. Jun 2009 13:24

Re: Transaktionen bei DBExpress mit MySQL
 
Hallo,

Zitat:

Manchmal geht es gut, manchmal bekomme ich eine Exception.
Welche Exception ?
wo genau ?

Welche MySQL-Engine wird benutzt ?

Delphi-Quellcode:
transaction := DatenModul.SQLConnection.BeginTransaction();
Ist das dein eigener Code, der eine Transaktion "erzeugt" ?

Wenn ja, wo wird die Transaktion den anderen Fach-Objekten
(lastbestellposition, Zuordnung usw. ) zugeordnet ?


Heiko

mannewolff 16. Jun 2009 13:54

Re: Transaktionen bei DBExpress mit MySQL
 
Exception und Engine kann ich erst heute Abend oder morgen liefern, wenn ich wieder an meinem heimischen Arbeitsplatz bin. Ich meine es war eine concurrent modification exception, allerding ist im Moment nur ein Client aktiv.

Vielleicht ist die Architektur ja schon fehlerhaft. Ich habe ein Delphi Datenmodul. In dem Datenmodul habe ich eine TSQLConnection und eine TSQLQuery Komponente. Alle Fachobjekte benutzen die gleiche Query, um ihr SQL abzusetzen (vielleicht ist das schon das Problem).

Ich rufe also die BeginTransaction() Methode der TSQLConnection-Komponente auf. Dann feuern verschiedene Fachobjekte ihre SQLs über die gleiche (!) TSQLQuery Komponente ab. Zum Schluss dann das Commit eben über diese TSQLConnection-Komponente.

Alle Fachobjekte erben von einem TPersistence-Objekt, welches eben die SQL erzeugt und absetzt. Darum auch alle SQLs über das gleiche Query Objekt.

-manne

hoika 17. Jun 2009 06:44

Re: Transaktionen bei DBExpress mit MySQL
 
Hallo,

noch ein interessanter Link zur Benutzung

DBX

Das hat zwar mit deiner Exception nichts zu tun,
aber die Benutzung des raise hier ist interessant.


Heiko

mannewolff 17. Jun 2009 07:56

Re: Transaktionen bei DBExpress mit MySQL
 
Also ich arbeite mit MySQL Server 5.1.

Die Exception, die fliegt: TDBXError 'Commands out of sync; you can't run this command now'.

Es tritt nur auf, wenn ich mehrere SQLs, aus unterschiedlichen Fachobjekten, die mit der gleichen Query abgesetzt worden sind committen will. Wahrscheinlich muss ich für jedes Fachobjekt eine frische Query nehmen. I try.

Nachtrag: Die Exception tritt auch auf, wenn ich für jedes Fachobjekt eine eigene Query benutze.

Manfred

hoika 17. Jun 2009 08:28

Re: Transaktionen bei DBExpress mit MySQL
 
Hallo,

tipp mal "Commands out of sync; you can't run this command now mysql" in google ein.
Es sieht so aus, als ob du die Queries falsch benutzt.
Vielleicht ein Open, ohne die Daten zu holen oder ohne Close.

An deinem obigen Code sehe ich ja, dass du ein Feind von finally bis ...

dein Code

Delphi-Quellcode:
       
Zuordnung := TAnfrageZuBestellposition.Create();
Zuordnung.FK_ANFRAGE := lastAnfrage.id;
Zuordnung.FK_BESTELLPOSITION := lastbestellposition.id;
Zuordnung.save();
Zuordnung.Free();
mit finally

Delphi-Quellcode:
Zuordnung := TAnfrageZuBestellposition.Create();
try
  Zuordnung.FK_ANFRAGE := lastAnfrage.id;
  Zuordnung.FK_BESTELLPOSITION := lastbestellposition.id;
  Zuordnung.save();
finally
  Zuordnung.Free();
end;
Bei den Queries muss das genauso sein

Delphi-Quellcode:
with Query do
begin
  SQL.Clear;
  SQL.Add
  Open;
  try
  finally
    Close;
  end;
end;
btw: vielleicht fehlt auch irgendwo das SQL.Clear ?? (bei gemeinsamer Nutzung einer Query)



#Update:
Schau dir mal folgenden Thread an, vor allem im unteren Viertel.
MySQL und DBX



Heiko

mannewolff 25. Aug 2009 10:47

Re: Transaktionen bei DBExpress mit MySQL
 
Vielleich klippst Du das hier rein oder schickst es mir als mail (wolff@pointers.de) ich habe da keinen Zugang und eine 30 Tage Trial mit Kreditkartenangabe mache ich nicht so gerne. Habe leider immer noch keine Lösung gefunden. Inzwischen arbeite ich mit gepoolten Querys. Jedes aktive Fachobjekt hat also eine eigene Query. Aber es ist egal ob offene Query, geschlossene, die Exception kommt immer noch. Ohne Transaktionen habe ich auf die Dauer Angst, dass inkonsistente Daten in die Datenbank kommen.

hoika 25. Aug 2009 11:50

Re: Transaktionen bei DBExpress mit MySQL
 
Hallo,

1

Kommt denn die Meldung sofort beim ersten mal ?
Wie sieht denn deine Abfrage aus ?

Verwechselt du vielleicht ExecSQL und Open
(weiss jetzt nicht, ob DBX das auch trennt)?


Heiko

mannewolff 25. Aug 2009 11:59

Re: Transaktionen bei DBExpress mit MySQL
 
Ich mache in der Transaktion ein update auf zwei verschiedene Queries. Jedes Update sieht wie folgt aus:

Delphi-Quellcode:
  try
  try
     initquery();
     ...
     query.ExecSQL();
  except
     On E: Exception do
     begin
       Error('TPersistenz.save()', E);
       raise(E);
     end;
  end;
  finally
     query.Close();
  end;
end;
[edit=mkinzler]Code-Tag durch Delphi-Tag ersetzt Mfg, mkinzler[/edit]


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