Michael Schröpl: überschreiben von Änderungen vermeiden

Beitrag lesen

Hi Andreas,

genau für diesen Fall wurde das Konzept der Transaktionen in Datenbanksystemen erfunden.
das Problem ist die Client-Server Architektur. Meines Wissens ist es nicht möglich mit PHP auf dem Server eine Transaktion zu starten, den Thread zu beenden, und bei einem Request 10 Minuten später diese Transaktion wieder aufzunehmen und zu beenden. Wenn das alles innerhalb eines Scripte wäre hätte ich auch kein Problem, nur liegt zw. dem Start und dem Ende der Transaktion das Ausfüllen von 3 HTML-Formularen und dem entsprechend der HTTP Verkehr vor und nach jedem Ausfüllen eines Formulares. Solange darf das nichts passieren.

Genau. Du solltest alle Daten der Transaktion inkrementell aufsammeln (Session!) und die eigentliche Änderung in der Datenbank erst dann starten, wenn Du alles in einem Rutsch durchführen kannst. Dann greift das Transaktionskonzept, und Dein Problem ist gelöst.

Und Du mußt in diesem Moment immer noch darauf achten, daß Dir inzwischen die Grundlagen für diese Transaktion entzogen worden sein können, weil jemand anderes weniger als 10 Minuten brauchte, um eine Änderung einzugeben. Dies kannst Du ggf. durch entsprechende WHERE-Klauseln in Deinen UPDATE-Statements sicherstellen (aus Effizienzgründen könnte ein Timestamp der letzten Änderung pro Datensatz helfen).

Ja, und das geht wohl nur über einen Timeout. Im Prinzip bilde ich ja eine Transaktion nach wenn ich den Datensatz mit einem Flag sperre, und da HTTP Zustandslos ist brauche ich halt mal wieder diesen Timeout. Oder meinst DU dasgeht auch anders?

Löse Dich von der Idee, Deine SQL-Statements auf mehrere Skripte zu verteilen - genau hier liegt Dein Problem.

Viele Grüße
      Michael

--
T'Pol: I apologize if I acted inappropriately.
V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
(sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
 => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.