mmofacts.com

Wie am besten Race Condition vermeiden

gepostet vor 16 Jahre, 3 Monate von splasch

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

gepostet vor 16 Jahre, 3 Monate von TheUndeadable

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.

http://en.wikipedia.org/wiki/Critical_section

gepostet vor 16 Jahre, 3 Monate 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.

gepostet vor 16 Jahre, 3 Monate von TheUndeadable

In PHP hatte ich in einem Uralt-Projekt Datei-Locks genutzt. Waren zwar unschön, aber für diesen Zweck ausreichend.

gepostet vor 16 Jahre, 3 Monate von Kallisti

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.

gepostet vor 16 Jahre, 3 Monate von exe

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.

gepostet vor 16 Jahre, 3 Monate von Klaus

Sessions wären auch eine Alternative. Zumindest in PHP sind die Sessions auf den User bezogen und arbeiten bereits mit File-Locks.

gepostet vor 16 Jahre, 3 Monate von Kampfhoernchen

Eine transaktionsfähige Datenbank sollte diese Probleme lösen.

Auf diese Diskussion antworten