AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Transaktionen bei DBExpress mit MySQL
Thema durchsuchen
Ansicht
Themen-Optionen

Transaktionen bei DBExpress mit MySQL

Ein Thema von mannewolff · begonnen am 16. Jun 2009 · letzter Beitrag vom 25. Aug 2009
Antwort Antwort
mannewolff

Registriert seit: 21. Okt 2008
48 Beiträge
 
RAD-Studio 2009 Arc
 
#1

Transaktionen bei DBExpress mit MySQL

  Alt 16. Jun 2009, 12:32
Datenbank: MySQL • Version: 5.0 • Zugriff über: DBExpress
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Transaktionen bei DBExpress mit MySQL

  Alt 16. Jun 2009, 14:24
Hallo,

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

Welche MySQL-Engine wird benutzt ?

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
Heiko
  Mit Zitat antworten Zitat
mannewolff

Registriert seit: 21. Okt 2008
48 Beiträge
 
RAD-Studio 2009 Arc
 
#3

Re: Transaktionen bei DBExpress mit MySQL

  Alt 16. Jun 2009, 14:54
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Transaktionen bei DBExpress mit MySQL

  Alt 17. Jun 2009, 07:44
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
Heiko
  Mit Zitat antworten Zitat
mannewolff

Registriert seit: 21. Okt 2008
48 Beiträge
 
RAD-Studio 2009 Arc
 
#5

Re: Transaktionen bei DBExpress mit MySQL

  Alt 17. Jun 2009, 08:56
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Transaktionen bei DBExpress mit MySQL

  Alt 17. Jun 2009, 09:28
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
Heiko
  Mit Zitat antworten Zitat
mannewolff

Registriert seit: 21. Okt 2008
48 Beiträge
 
RAD-Studio 2009 Arc
 
#7

Re: Transaktionen bei DBExpress mit MySQL

  Alt 25. Aug 2009, 11:47
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Transaktionen bei DBExpress mit MySQL

  Alt 25. Aug 2009, 12:50
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
Heiko
  Mit Zitat antworten Zitat
mannewolff

Registriert seit: 21. Okt 2008
48 Beiträge
 
RAD-Studio 2009 Arc
 
#9

Re: Transaktionen bei DBExpress mit MySQL

  Alt 25. Aug 2009, 12:59
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]
  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 08:35 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