Ich versuche eine Tabelle "atomisch" über eine andere zu kopieren. Grundsätzlich möchte ich eine Tabelle regelmäßig aktualisieren, so dass ein Prozess, der aus der Tabelle liest, kein unvollständiges Ergebnis erhält, wenn ein anderer Prozess die Tabelle aktualisiert.
Um Hintergrundinformationen zu erhalten, möchte ich eine Tabelle, die als Rangliste für ein Spiel dient. Diese Rangliste wird alle paar Minuten in einem separaten Prozess aktualisiert. Mein Denken ist wie folgt:
Table SCORES enthält das öffentlich sichtbare Leaderboard, das gelesen wird, wenn ein Benutzer das Leaderboard anzeigt. Diese Tabelle wird alle paar Minuten aktualisiert. Der Prozess, der das Leaderboard aktualisiert, erstellt eine SCORES_TEMP-Tabelle, die das neue Leaderboard enthält. Sobald diese Tabelle erstellt ist, möchte ich ihren gesamten Inhalt "atomar" nach SCORES kopieren. Ich denke, was ich tun möchte ist etwas wie:
%Vor%Ich möchte alles in SCORES ersetzen. Ich muss meine Primärschlüssel oder Autoinkrementwerte nicht beibehalten. Ich möchte nur alle Daten von SCORES_TEMP einbringen. Aber ich weiß, dass die Rangliste leer bleibt, wenn jemand die Ergebnisse vor diesen 2 Anweisungen sieht. Wie kann ich das atomar machen, so dass niemals leere oder unvollständige Daten angezeigt werden? Danke!
Verwenden Sie die Tabelle umbenennen
%Vor%Es ist atomar, funktioniert auf allen Speicher-Engines und muss die Indizes nicht neu erstellen.
In MySQL, wegen des Verhaltens von TRUNCATE denke ich, dass du es brauchst zu:
%Vor%Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, die DDL-Transaktion sicher zu machen.
Ich weiß nicht, dass Hot-MySQL Transaktionen behandelt, aber in T-SQL könnte man
schreiben %Vor%Auf diese Weise wäre Ihre Operation "atomar", aber nicht sofort.
Tags und Links mysql