Wie stellen Sie sicher, es gibt keine race-condition in der MySQL-Datenbank, die beim Inkrementieren ein Feld?
Wie Sie verhindern, dass eine race-condition in der MySQL-Datenbank, wenn zwei verbindungen aktualisieren möchten, müssen Sie den gleichen Datensatz?
Beispielsweise Verbindung 1 erhöhen möchte "versucht" zu begegnen. Und die zweite Verbindung will, dasselbe zu tun. Beide verbindungen SELECT
die "versucht" zählen, erhöhen Sie den Wert, und beide UPDATE
"versucht" mit den erhöhten Wert. Plötzlich "versucht" nur "versucht+1" anstatt "versucht+2", da beide verbindungen habe die gleiche "versucht" und erhöht ihn um eins.
Wie dieses problem zu lösen?
- Ich schlage vor, Sie suchen zum Thema: "Lock auf die Tabelle" Mysql-Funktion. Sperren einer Tabelle erlaubt, zur Lösung dieser Art von situation
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier 3 unterschiedliche Ansätze:
Atomic update
und es erfolgt atomar.
Transaktionen
Wenn Sie tun müssen, wählen Sie zuerst den Wert und aktualisieren Sie es in Ihrer Anwendung, werden Sie wahrscheinlich benötigen, um Transaktionen verwenden. Das bedeutet, Sie haben die Verwendung von InnoDB nicht MyISAM-Tabellen.
Deine Abfrage würde etwa so Aussehen:
wenn die Transaktion fehlschlägt, müssen Sie möglicherweise manuell wiederholen.
Version Schema
Ein gemeinsamer Ansatz ist die Einführung einer version Spalte in Ihrer Tabelle. Ihre Fragen möchte etwas tun, wie:
Wenn das update fehlschlägt/liefert 0 Zeilen betroffen, hat jemand aktualisiert die Tabelle, in der Zwischenzeit. Sie haben ganz zu Beginn - das heißt, wählen Sie die neuen Werte ein, machen die Anwendung der Logik und versuchen, das update erneut.
Verwenden Sie eine einzige Anweisung anstelle von zwei. Eine einzelne
UPDATE
Aussage führt, dass sowohl das Lesen und das schreiben wird atomar sind und keine Konflikte mit anderen gleichzeitigen update.Oder Sie können Transaktionen zu machen, die zwei Atomare Operationen.
Oder, primitiver, die Tabelle sperren, während Sie gerade Lesen/schreiben.
tries=tries+1
- beide setzen Sie Sie auf 4. Ich habe die Entwicklung des Programms, sondern allein, wenn der Benutzer beginnen, es zu verwenden, Sie erhalten möglicherweise falsche Ergebnisse. 🙁