Hi
Wie vermeidet ihr in euren Scripten Race Condition?
Sperrt ihr einfach die Tabellen oder habt ihr dafür eine elegantere Lösungen?
Mfg Splasch
Wie am besten Race Condition vermeiden
Ich persönliche nutze CriticalSections wenn alles in einem Prozess läuft, bzw Prozessmutexe, wenn Backend und Frontend in unterschiedlichen Prozessen laufen. [Der Unterschied zwischen beiden ist eigentlich eher ne Win-spezifische Sache. CriticalSections arbeiten lokal im Speicher und nicht über Prozessgrenzen, was sie recht schnell machen]
Datenbanklocks nutze ich persönlich weniger, zu speziellen Zwecken eher Datenbanktransaktionen.
In PHP ist das aber etwas schwerer; Race Conditions kannst du da dort tatsächlich bei einer Webanwendung nur verhindern, wenn die entsprechenden Queries immer mit einer Bedingung abgesichert werden und dann auf Erfolg geprüft werden. Ideal wäre die Verwendung einer Transaktion.
In PHP hatte ich in einem Uralt-Projekt Datei-Locks genutzt. Waren zwar unschön, aber für diesen Zweck ausreichend.
Original von knalli
In PHP ist das aber etwas schwerer; Race Conditions kannst du da dort tatsächlich bei einer Webanwendung nur verhindern, wenn die entsprechenden Queries immer mit einer Bedingung abgesichert werden und dann auf Erfolg geprüft werden. Ideal wäre die Verwendung einer Transaktion.
Und was spricht gegen write/read (je nach Bedarf) locks auf die entsprechenden Tabellen, bis der kritische Abschnitt vorbei ist? Ich wuerde es auch mit Transaktionen loesen, aber ein manuelles locking sollte doch ebenso funktionieren.
Locks auf ganze Tabellen kosten zuviel Zeit. Da kann der Datenbankserver unter Volllast stehen aber die CPU langweilt sich bei unter 50% Auslastung weil die meiste Zeit in Locks draufgeht.
Row-level-locking ist eventuell noch eine vertretbare Variante. Ich würde aber noch am ehesten serialisierbare Transaktionen verwenden und sie im Falle einer Racecondition eben wiederholen. Das spart viel an manuellem Synchronisierungsaufwand - zu Lasten der Wiederholung einer Transaktion falls es zu einer Racecondition kommt. Aber das ist ein verhältnismäßig seltener Fall, der allergrößte Teil der Transaktionen geht reibungslos durch.Sessions wären auch eine Alternative. Zumindest in PHP sind die Sessions auf den User bezogen und arbeiten bereits mit File-Locks.
Eine transaktionsfähige Datenbank sollte diese Probleme lösen.
Hmm
Das hab ich noch dazu im Netz gefunden.
http://www.php-faq.de/q/q-race-condition.html
Dabei wird eine Temperare Datei angelegt und wieder gelöscht.
(http://de3.php.net/manual/de/function.tempnam.php)
Mfg Splasch