Das Problem ist ganz einfach zu beschreiben:
Es gibt eine Liste mit Einträgen (z.B. Adressen). Diese werden über
SELECT * FROM adressen
ausgelesen. Nun kann der Benutzer einen Eintrag auswählen und diesen in einer anderen, modalen FORM bearbeiten.
Dazu wird der Satz für diese Form neu angefordert.
SELECT * FROM adressen WHERE id=:ID
.
Leider gibt es in Interbase kein FOR UPDATE. Zumindest scheint es nicht zu funktionieren.
Denn nun kann ein anderer Benutzer ja den gleichen Satz öffnen.
Beide machen ihre Änderung und speichern ab:
UPDATE adressen SET aenderung="änderung" WHERE id=:ID
Entweder überschreibt der, der zuletzt speichert die Änderungen des ersten oder - je nach Einstellung der Transaction - werden die Änderungen des zweiten nicht angenommen. Einer der beiden wird sich ärgern.
Schon beim Abrufen des Satzes für die Änderung muss dem zweiten Benutzer meiner Meinung nach mitgeteilt werden, dass sich der Datensatz gerade in Bearbeitung befindet. Dies mache ich eben durch den Versuch eines Pseudo-UPDATES das fehlschlägt, wenn eine andere Transaction den Datensatz in Bearbeitung hat.
@Bernhard: Inwiefern diese Methode den Server belastet muss ich jetzt testen. Daran hatte ich nicht gedacht. Hoffentlich schafft er es.
@Albi: Kennst du eine weitere Methode? Deine Nachfrage zielt nämlich genau ins Schwarze.
Danke schonmal...
Michael