dedlfix: Transaktion mit PHP5 und MySQL

Beitrag lesen

echo $begrüßung;

Wenn aber ein zweiter Anwender parallel den Datensatz einließt, bevor der erste den Datensatz speichert und dann die Daten speichert, bekommt der erste Anwender nicht die Änderung des zweiten Anwenders mit. Speichert der Erste nun, überschreibt dieser wieder die Änderungen des zweiten Anwenders, ohne jemals die Änderung des Zweiten mitbekommen, gesehen zu haben...
Mein Idee ist es den Datensatz zu sperren, wenn jemand diesen ließt und beim Speichern wieder freizugeben, wenn dieser gespeichert wird. Wie kann ich dies technisch lösen?

Eine Sperre wäre durch das manuelle Setzen eines Flags möglich. Die im DBMS vorhandenen Möglichkeiten zum Sperren sind für das Szenario nicht verwendbar, weil sie am Verbindungsende, was spätestens mit dem Script-Ende zusammenfällt, aufgelöst werden. Ein gravierender Nachteil des manuellen Flags ist seine eventuell nicht stattfindende Rücksetzung, weil der Bearbeiter einfach die Bearbeitung abbricht, ohne dass der Webserver etwas davon mitbekommt, oder weil er einfach vergessen hat, die Bearbeitung zu beenden.

Eine weitere (und vermutlich beste mit dem wenigsten Aufwand im Normalfall) Möglichkeit ist, einen Timestamp für ein "zuletzt bearbeitet am/um" mitzuführen. Jeder Update wird um eine Bedingung erweitert, die den Updaten nur dann ausführt, wenn der Timestamp beim Lesen mit dem aktuellen Timestamp im Datensatz übereinstimmt. Ergibt das Ergebnis der Query-Funktion, dass kein Datensatz geändert wurde, liegt das dann daran, dass entweder der Datensatz gelöscht wurde oder verändert wurde und sich damit der Timestamp geändert hat.
Je nach Anwendungsfall kann ein Timestamp schon zu grob sein, da er nur sekundengenau ist. In dem Fall kann man einen anderen eindeutige(re)n Wert verwenden, beispielsweise einen UUID.

echo "$verabschiedung $name";