2012-04-04 5 views
1

Für ein Spiel, versuche ich eine Scores-Tabelle zu implementieren. Je nach Spiellogik ändern sich die Punktzahlen normalerweise, wenn ein Benutzer eine Runde beendet, die alle paar Minuten stattfindet; aber es gibt keine Garantie, dass zwei Benutzer dieselbe Zeit beenden.Ersetze ganze Daten in MySQL-Tabelle

Um die Bewertungen nicht jedes Mal neu zu berechnen, wenn ein Benutzer die Ergebnisse überprüft, möchte ich die Score-Daten in einer persistenten Tabelle speichern, die bei jeder Runde aktualisiert wird.

Ich plane, diese

TRUNCATE TABLE scores; INSERT INTO SCORES SELECT .... 

von

zu implementieren, aber meine Sorge ist, was passiert, wenn zwei Benutzer gleichzeitig beenden. Ich übergebe die gesamte Abfrage in einer Verbindung (von ASP.NET, wenn das wichtig ist), aber sind zwei Abfragen zusammen als atomar betrachtet? Oder schlagen Sie vor, dass ich eine manuelle Transaktionslogik implementieren muss?

Wenn Sie eine Transaktion vorschlagen, ist es ausreichend, die Abfrage mit "BEGIN TRAN ... END TRAN" zu umschließen und schlagen Sie MyISAM oder InnoDB für diese Tabelle vor?

Meine MySQL-Version ist 5.0.92-Protokoll, wenn das zählt.

+0

Warum schneiden Sie die Tabelle jedes Mal ab, wenn Sie die Ergebnisse berechnen? – Jordan

Antwort

0

Zwei Abfragen sind nur atomar, wenn sie innerhalb einer Transaktion ausgeführt werden. Und selbst dann werden sie nur für den Rest der Welt atomar sein. Innerhalb der Transaktion sind es immer noch zwei völlig getrennte Operationen.

Transaktionen schützen Sie nicht vor zwei + Benutzern, die Operationen am Datensatz ausführen. Sie müssen weiterhin Sperren für die relevanten Tabellen einrichten, um den gleichzeitigen Zugriff zu verhindern.