Verständnisfrage zu Transactions [gelöst]

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Verständnisfrage zu Transactions [gelöst]

Beitrag von AlterMann »

Hallo

Die Frage ist eigentlich eine Fortsetzung zu dieser: viewtopic.php?f=17&t=8114

Ich habe jetzt nach jedem SQLQuery.Execute ein SQLTransaction.Commit eingefügt.
Funktioniert soweit auch wieder, aber:

Da mein Programm aus zwei Teilen besteht fällt den Benutzern folgendes Verhalten auf:

Benutzer mit Programm A fügt einen Datensatz ein (Insert, SQLQuery.Execute, SQLTransaction.Commit)

In Programm B werden diese Datensätze mit folgendem Code eingelesen:

Code: Alles auswählen

  SQLQuery1.SQL.Text := 'select a.Id, a.zeichnnr, a.stk, a.kalk, a.lz, a.gueltig, a.nick, t.benennung, g.benennung, a.pos, t.handel from anfrapos a left join teile t on a.zeichnnr = t.zeichnnr left join geraete g on a.zeichnnr = g.zeichnnr where a.anfrId = '+#39+anfrId+#39+' order by a.Pos, a.stk, a.Id, a.gueltig';
  SQLQuery1.Open;
  while not SQLQuery1.EOF do
   begin
 
 {Anzeigeroutinen}
 
    SQLQuery1.Next;
   end;
  SQLQuery1.Close;
 


Dabei zeigt sich aber, daß in Programm B der neue Datensatz erst nach beenden und neustarten von Programm B angezeigt wird.
Was mach' ich da wieder falsch (Bis zum Lazarusupdate bei dem das AutoCommit entfernt wurde, hat das alles tadellos funktioniert)

Danke für's Lesen
Christian
Zuletzt geändert von AlterMann am Mo 29. Sep 2014, 12:41, insgesamt 1-mal geändert.
Früher war alles besser. Und aus Holz!

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Verständnisfrage zu Transactions

Beitrag von hde »

Das hat nichts damit zu tun, ob der commit automatisch oder manuell von dir eingefügt wird,sondern nur von der zeitlichen Abfolge der Abläufe.

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Verständnisfrage zu Transactions

Beitrag von AlterMann »

Wie muß ich das verstehen?

Ich lasse hier beide Programme auf der gleichen Maschine laufen und auch HeidiSQL um die Datenbank selbst zu sehen.

Ich trage in Programm A eine neue Zeile ein (Das ruft in Programm A die gleiche Routine auf wie später in Programm B um die Daten neu anzuzeigen)

In Programm A ist die neue Zeile sichtbar.

Ich schaue in HeidiSQL und sehe (nach einem Refresh der Anzeige), daß die Zeile auch in der Datenbank gespeichert wurde.

Ich löse in Programm B ein Anzeigerefresh (= Daten neu aus DB lesen (siehe obige Routine)) aus.
Neue Zeile ist nicht zu sehen.

Ich schließe Programm B und starte es neu.
Jetzt ist die Zeile da.

Sieht so aus als ob Programm B nicht wirklich aus der DB, sondern aus einem Zwischenspeicher o.ä. liest.
Früher war alles besser. Und aus Holz!

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Verständnisfrage zu Transactions

Beitrag von AlterMann »

Ich hab ein (besser gesagt zwei) kleines Beispielprogramm gebastelt, mit dem sich das (Fehl-)verhalten zeigen läßt.

Falls jemand so nett ist es sich anzusehen:

Im Objektinspector muß noch Benutzername, Passwort und Hostname an eure Gegebenheiten angepaßt werden.

In MySQL hab ich eine Datenbank testdb mit einer Tabelle testtab angelegt. testtab hat zwei Felder: Id (Int autoinkrement, primary) und text (varchar 20)

Dann beide Programme starten.

Mit schreiben können einzeln neue Texte in testtab eingefügt werden.

Lesen liest sie ein.

Bei mir allerdings nur die, die beim Programmstart schon in der DB standen, obwohl sie lt. HeidiSQL sofort in die DB geschrieben werden.

Was mach' ich falsch?

LG
Christian
Früher war alles besser. Und aus Holz!

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Verständnisfrage zu Transactions

Beitrag von AlterMann »

War anscheinend zu groß mit *.exe-Dateien, also nocheinmal:
Dateianhänge
SQLTest2.zip
(2.48 MiB) 71-mal heruntergeladen
Früher war alles besser. Und aus Holz!

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Verständnisfrage zu Transactions

Beitrag von hubblec4 »

Hi ALterMann

Ich bin kein Profi und habe durch dieses Forum sehr viel Hilfe erfahren.
auch micht hatte damals die Umstellung durch das LAzarus-update betroffen.

Zuerst habe ich natürlich auch den
Transaction.Commit Befehl genutzt und musste dann feststellen das wenn ich mein Programm auf einer anderen Maschine ausführe, ich die Einträge nicht sehen kann.

Ich habe dann den
Transaction.CommitRetaining Befehl ausprobiert und siehe da ab jetzt läuft es.

Vll hilft dir das auch.

LG
hubble

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Verständnisfrage zu Transactions

Beitrag von AlterMann »

Die Lösung:

Ich habe jede SQLQuery einer eigenen SQLTransaction zugeordnet und in die Ereignisse BeforeOpen den Befehl

Code: Alles auswählen

 
if not SQLTransaction.Active then SQLTransaction.StartTransaction;
 


und in AfterClose

Code: Alles auswählen

 
SQLTransaction.Commit;
 


eingefügt.

Mir ist bewußt, daß ich damit die Vorteile der Transactions nicht nutze, aber für meine Bedürfnisse ist diese Lösung IMHO (zumindest nach derzeitigem Wissensstand) brauchbar und gut.

Vielen Dank an alle Beteiligten
Christian
Früher war alles besser. Und aus Holz!

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Verständnisfrage zu Transactions

Beitrag von mse »

Der BeforeOpen handler ist vermutlich nicht notwendig, da das intern sowieso gemacht wird. Bitte beachte, dass <transaction>.commit() alle verbundenen queries schliesst, vielleicht ist <transaction>.commitretaining() eher in deinem Sinn.
Zuletzt geändert von mse am Mo 29. Sep 2014, 13:38, insgesamt 1-mal geändert.

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Verständnisfrage zu Transactions [gelöst]

Beitrag von AlterMann »

Danke für den Hinweis.

Aber in meinem Fall (Ich lese die Daten aus der DB, speichere sie in sichtbaren Komponenten, und speichere sie wenn ein Benutzer dies ausdrücklich bestätigt) ist mir ganz recht wenn alles was mit der Datenbank zu tun hat nur aktiv ist, wenn (bewußt) eingelesen oder gespeichert wird.
Es sind inzwischen viele verschachtelte Aufrufe geworden, da ist diese Herangehensweise aus meiner Sicht betriebssicherer.
Früher war alles besser. Und aus Holz!

Antworten