Ich habe eine mySQL-Aktualisierungsabfrage, die manchmal alle Felder aktualisiert und manchmal alle Felder außer einem aktualisiert.
Es sind etwa 10% der Anrufe fehlgeschlagen.
Mein Tisch ist:
%Vor%Meine Abfrage lautet:
%Vor%Wenn dies fehlschlägt, werden result, date_synced und updated_at aktualisiert, der Status bleibt jedoch unverändert.
Es gibt eine andere Abfrage, die nur das Statusfeld aktualisiert und auch diese zeitweise ausfällt.
Ich konnte das Problem in unserer Testumgebung nicht reproduzieren. Könnte etwas mit der mySQL-Datenbank für die Produktion oder einer Art von Kollisionsverriegelung nicht stimmen?
Ich habe mehr Informationen. Ich benutze mysqli. Die andere Abfrage, die nur den Status aktualisiert, verwendet mysql. Würde das ein Problem verursachen?
Ich dachte InnoDB von Zeile gesperrt. Es erlaubt keine partiellen Zeilenaktualisierungen, oder?
Ein weiteres Update, um die Kommentare zu adressieren.
Mein Code-Flow ist ziemlich linear.
%Vor%Das Statusfeld wird niemals auf 0 (nach dem Flash) oder 1 (nach dem API-Aufruf) zurückgesetzt. Da das Datum _synced und das Ergebnis gesetzt sind, aber (manchmal) der Zustand immer noch 1 ist, ist es so, als ob die Aktualisierung auf das Statusfeld gelöscht wird.
Ich werde den Update-Trigger hinzufügen und sehen, ob das mir mehr Informationen gibt.
Gibt es an, dass "{n} Zeilen betroffen?"
istIst es auch wiederholbar? Können Sie die gleiche Abfrage auf die gleichen Daten ausführen und es wird verschiedene Dinge tun?
Wenn dies der Fall ist, könnten Sie eine beschädigte Installation oder eine beschädigte Datenbank haben.
Haben Sie versucht, eine Reparatur & amp; auf den Tischen optimieren? Das könnte helfen.
Tut mir leid wegen der Buckshot-Antwort: P
Passen Sie Ihre "Strenge" in MySQL an TRADITIONAL an:
%Vor%und versuchen Sie das Einfügen von der Konsole ohne PHP. Dann prüfen Sie auf Fehler, die es erklären könnten.
Setzen Sie die Strenge auf "verzeihen" zurück:
%Vor%Oder wenn Sie ein PDO-Objekt verwenden, um sich mit der Datenbank zu verbinden, erhalten Sie einen Fehler durch PHP mit etwas wie diesem:
%Vor%Machen Sie im Grunde genommen alles, um eine Fehlermeldung darüber zu erhalten, was gerade passiert. Es ist sehr wahrscheinlich, dass SQL einen Fehler sendet, aber PHP ist nicht dafür eingerichtet, es in Ihrem Skript anzuzeigen.
Ihre Abfrage, die "state" und andere Felder setzt, wird zweimal ausgeführt und manchmal wird eine Aufgabe schneller ausgeführt als eine andere. Es aktualisiert alle Felder und das Skript, das diese Aufgabe aufgerufen hat, führt auch eine MySQL-Abfrage aus, die das Feld "state" aktualisiert.
Zum Beispiel haben Sie ein PHP-Skript, das einen Shell-Befehl "tar" im Hintergrund über exec () ausführt und nach Abschluss "DB" im DB setzt. Die nächste Zeichenfolge Ihres PHP-Codes aktualisiert Ihren "Status" in Ihrer Datenbank. Aber manchmal läuft der von Ihnen aufgerufene bash-Befehl schneller als Ihr PHP-Skript MySQL update aufruft (wenn dieser bash-Befehl im Hintergrundmodus läuft).
Erster Schritt: Führen Sie ein Bash-Skript von PHP aus, das "state" = 3 setzt (wartet auf die weitere Verarbeitung), nachdem Sie fertig sind, aktualisieren Sie andere Felder mit Datum usw.
Nächster Schritt: In Ihrem PHP nach exec () setzen Sie "state" = 2 (in Bearbeitung). In diesem Fall, wenn Ihr Bash-Skript im Hintergrund die Aufgabe schneller erledigt als PHP die MySQL-Update-Abfrage ausführt, erhalten Sie den aktualisierten Datumswert und auch "state" = 2 (aber es hatte vor einer Sekunde den Wert = 3).
Ich hatte dieses Problem.