4 Stimmen

Einfügen einer Zeile und Vermeiden einer Race Condition (PHP/MySQL)

Ich arbeite an einem Multiplayer-Spiel, das einen Lobby-ähnlichen Bereich hat, in dem die Spieler "Sektoren" auswählen und betreten können. Das Lobby-Gateway wird von PHP betrieben, während das eigentliche Spiel von einem oder mehreren Java-Servern abgewickelt wird. Der Datenspeicher ist MySQL.

Der glückliche Weg: Ein Spieler wählt einen Sektor aus und teilt der Lobby mit, dass er ihn betreten möchte. Die Lobby prüft, ob dies in Ordnung ist, einschließlich der Prüfung, ob es zu viele Spieler in dem Sektor gibt (vergleicht die Anzahl der Einträge in den Sektorzuweisungen für diesen Sektor mit dem Wert max_players des Sektors). Der Spieler wird in die Tabelle sector_assignments aufgenommen, um ihn dem Sektor zuzuordnen. Der Spieler-Client erhält einen Passkey, mit dem er sich mit dem entsprechenden Spielserver verbinden kann.

Die Rennbedingung: Wenn zwei Spieler fast gleichzeitig Zugang zum selben Sektor beantragen, kann ich mir den Fall vorstellen, dass beide hinzugefügt werden, weil ein Platz frei war, als ihre Prüfung gestartet wurde, und die maximale Spielerzahl überschritten wird.

Ist die beste Lösung LOCK TABLE für sector_assignments? Gibt es eine andere Möglichkeit?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X