2016-04-19 4 views
1

Meine Benutzer müssen in der Lage sein, Dateien auf meine Website hochzuladen, also habe ich ein Datei-Uploader-Widget auf dem Frontend implementiert. Es ermöglicht mehrere Uploads gleichzeitig und jeder Upload löst jeweils eine Datei aus, um die Datei in der Datenbank zu speichern.Ich treffe eine Race Condition in meiner Laravel-Anwendung, wenn ich versuche, INSERT oder UPDATE, irgendwelche Vorschläge ... einzugeben?

Das Problem ist, dass Dateien als ein Array in einer einzigen Zeile in der Datenbank gespeichert werden müssen (ich weiß, ich weiß ... Legacy-Gründe).

In Englisch Pseudo-Code, hier ist was geschieht:

  1. Laravel eine neue Datei
  2. Laravel prüft, ob irgendwelche Dateien (überhaupt) wurden zu dieser Entität
  3. hochgeladen wurde sieht Nein Dateien wurden bereits hochgeladen? Erstellen Sie einen neuen Datensatz, um diese Datei zu speichern.
  4. Es gibt bereits Dateien für diese Entität? Aktualisieren Sie den vorhandenen Datensatz, um diese Datei dem Array hinzuzufügen.

Das Problem ist, dass, wenn mehrere Dateien auf einmal in schnellen Folge zum ersten Mal hochgeladen werden, Laravel der ersten Datei in der Datenbank Momenten nach der zweiten Datei durchgeführt eingegeben hat, hat es zu überprüfen, ob alle Dateien, um zu sehen, existieren bereits. Wir haben also doppelte Zeilen, anstatt sie in einem einzigen Datensatz zu aktualisieren.

Wenn ich 5 Dateien auf einmal hochlade, bekomme ich normalerweise 4 Zeilen in der Datenbank - 3 einzelne Einträge und einen doppelten Eintrag, die es geschafft haben, rechtzeitig aufzuholen.

Irgendwelche praktischen Möglichkeiten, um dieses Problem zu umgehen? Ich weiß, dass ich hier ein ND-Schema verwenden sollte, aber ich habe eine bereits komplexe Situation der Kürze halber stark vereinfacht!

Dies ist Laravel 5.2 mit einer MySQL InnoDB-Datenbank.

Antwort

0

Plan A: Wenn Sie eine neue Datei sehen, warten Sie eine Weile. Dann suche nach 'all' den Dateien und handle mit ihnen.

Plan B: Speichern Sie einen Zeitstempel mit dem Datensatz. Wenn eine andere Datei erkannt wird, prüfen Sie, ob ein Datensatz mit einem 'letzten' Zeitstempel vorhanden ist. Wenn ja, nehmen wir an, dass es Teil derselben "Gruppe" ist.

Beide Pläne werden gelegentlich Schluckauf haben - vor allem wegen der vagen Definition von "auf einmal".

Vielleicht haben Sie derzeit ein anderes Problem: Eine Datei wird zur Hälfte hochgeladen, wenn Sie es greifen, und Sie erhalten eine unvollständige Datei?

Die "echte" Antwort ist es, eine "Nachricht" hochgeladen zu haben, wenn sie fertig ist. Beginnen Sie dann nicht mit der Verarbeitung, bis Sie sie sehen. (Ich realisiere, dass dies wahrscheinlich nicht praktikabel ist.)

Verwandte Themen