![]() |
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:
Manchmal geht es gut, manchmal bekomme ich eine Exception.
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; Frage: Ist der Weg denn korrekt, dann kann ich weitersuchen. -manne |
Re: Transaktionen bei DBExpress mit MySQL
Hallo,
Zitat:
wo genau ? Welche MySQL-Engine wird benutzt ?
Delphi-Quellcode:
Ist das dein eigener Code, der eine Transaktion "erzeugt" ?
transaction := DatenModul.SQLConnection.BeginTransaction();
Wenn ja, wo wird die Transaktion den anderen Fach-Objekten (lastbestellposition, Zuordnung usw. ) zugeordnet ? Heiko |
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 |
Re: Transaktionen bei DBExpress mit MySQL
Hallo,
noch ein interessanter Link zur Benutzung ![]() Das hat zwar mit deiner Exception nichts zu tun, aber die Benutzung des raise hier ist interessant. Heiko |
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 |
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:
mit finallyZuordnung := TAnfrageZuBestellposition.Create(); Zuordnung.FK_ANFRAGE := lastAnfrage.id; Zuordnung.FK_BESTELLPOSITION := lastbestellposition.id; Zuordnung.save(); Zuordnung.Free();
Delphi-Quellcode:
Bei den Queries muss das genauso sein
Zuordnung := TAnfrageZuBestellposition.Create();
try Zuordnung.FK_ANFRAGE := lastAnfrage.id; Zuordnung.FK_BESTELLPOSITION := lastbestellposition.id; Zuordnung.save(); finally Zuordnung.Free(); end;
Delphi-Quellcode:
btw: vielleicht fehlt auch irgendwo das SQL.Clear ?? (bei gemeinsamer Nutzung einer Query)
with Query do
begin SQL.Clear; SQL.Add Open; try finally Close; end; end; #Update: Schau dir mal folgenden Thread an, vor allem im unteren Viertel. ![]() Heiko |
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.
|
Re: Transaktionen bei DBExpress mit MySQL
Hallo,
![]() 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 |
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:
[edit=mkinzler]Code-Tag durch Delphi-Tag ersetzt Mfg, mkinzler[/edit]
try
try initquery(); ... query.ExecSQL(); except On E: Exception do begin Error('TPersistenz.save()', E); raise(E); end; end; finally query.Close(); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz