Sven Rautenberg: Session-Daten Schreib- oder Schreib-Lese-Sperre?

Beitrag lesen

Moin!

http://de.php.net/manual/de/function.session-write-close.php

Bekommen Session-Daten wirklich nur eine Schreibsperre oder auch eine Lesesperre?

"Nur" ist die falsche Wortwahl. Eine Schreibsperre ist eine exklusive Sperre (bei flock das LOCK_EX), d.h. zeitgleiche Lesezugriffe werden unterbunden.

Siehe auch die englische Dokuseite von session_write_close(), die das verdeutlicht: "...but as session data is locked to prevent concurrent writes only one script may operate on a session at any time."

Das Sperren einer Session gegen gleichzeitige Schreibvorgänge wird übrigens gerne vergessen, wenn man eigenständige Session-Handler (zum Schreiben in die Datenbank) verwendet. Zwar wird in diesem Fall keine Zerstörung von Daten durch unkoordiniertes gleichzeitiges Schreiben in eine Datei stattfinden, aber definitiv können zwei Skripte fast zeitgleich gestartet werden, dann dieselben Daten laden, jeweils unterschiedlich abändern, und am Ende überlebt nur die eine Änderung, die zuletzt in die Datenbank zurückgeschrieben wurde.

Mit solchen schwer zu debuggenden Race-Conditions kann man sich ziemlich fiese Probleme einhandeln.

Und schon allein aus dieser Überlegung heraus ist klar, dass das Verwenden einer Datei zwingend exklusives Locking voraussetzt. Das ist übrigens exakt der Fall "Datei einlesen und verändert später wieder speichern" aus dem Artikel "Sperren von Dateien".

- Sven Rautenberg