dedlfix: php, SQL, Multiuser - SESSION oder nicht ?

Beitrag lesen

Tach!

Wenn ich ohne SESSION Variablen arbeite, kann es da theoretisch passieren das Informationen verloren oder überschrieben/gelöscht werden, wenn zufällig 2 Nutzer gleichzeitig am selben Datensatz arbeiten ?

Zum Verständnis muss man den Vorgang etwas genauer betrachten.

Vorgang 1:

  • PHP-Script startet
  • Verbindungsaufbau zum DBMS
  • Daten lesen
  • PHP-Script endet, Verbindungsabbau zum DBMS

Ob der Verbindungsabbau implizit am Scriptende oder explizit mit Funktionsaufruf passiert, spielt hier keine Rolle.

Vorgang 2:

  • PHP-Script startet
  • Verbindungsaufbau zum DBMS
  • Datensatz schreiben
  • PHP-Script endet, Verbindungsabbau zum DBMS

Ohne eine Verbindung hat das DBMS keinerlei Ambitionen zugunsten irgendeines Users irgendwelche anderen Datenzugriffe zu verhindern. Zwischen den beiden Vorgängen können also beliebige Änderungen durch andere Nutzungen vorgenommen werden.

Während eine Verbindung besteht, könnte man mit Transaktionen und Datensatz- oder Tabellensperrungen andere Zugriffe verhindern. Das hilft dir aber in deinem Szenario nicht. Man verwendet das nur, um komplexe Vorgänge ganz oder gar nicht ohne Störungen durch andere Vorgänge durchzuführen. Selbst wenn man die Verbindung offenhalten kann (persistente Verbindung kennt PHP auch in bestimmten Konstellationen), macht man aber sowas generell nicht, wenn der Anwender viel Zeit braucht, um die Daten zu ändern. Damit blockiert man nur die anderen Zugriffe.

Damit keine Daten durcheinander überschrieben werden, braucht man eine andere Vorgehensweise. Bevor man schreibt, muss man prüfen, ob die Daten auf demselben Stand sind, wie zum Zeitpunkt des Lesens. Dazu braucht es pro Datensatz einen Versionszähler, oder einen Timestamp, wenn der fein genug auflöst.

UPDATE felddaten, SET version=version+1 WHERE id=$id AND version=$gelesene_version;

Das wäre eine Vorgehensweise. Wenn die Anzahl der betroffenen Datensätze gleich 0 ist, war zwischenzeitlich jemand am Versionszähler, und man würde fremde Änderungen überschreiben.

Wie du nun damit umgehst, wenn solch eine Konkurrenzsitiuation festgestellt wird, ist eine Sache deiner Geschäftslogik und was deine Anwender brauchen.

Das ganze Thema nennt sich Concurrency Control. Damit wirst du noch mehr und genauere Informationen finden.

dedlfix.