2016-12-03 1 views
0

Ich habe eine Laravel 5.2 Backend und Angular 1 Frontend-Anwendung. Sie kommunizieren mithilfe der REST-API. Es gibt einen Code, der einige Datenbankdaten bei jedem Laden der Seite aktualisiert (die App ist ein Browserspiel, also werden in diesem Fall die Ressourcen und Einheiten des Spielers aktualisiert/produziert), aber ich habe einige Probleme bekommen.Laravel mögliche Wettlaufbedingung?

Es gibt Situationen, in denen das Frontend mehrere API-Endpunkte gleichzeitig anfordert. Wenn seit der letzten Anforderung eine neue Einheit erstellt wurde, sollte die Entityattached() an die Player Modell (Viele-zu-viele-Beziehung) sein. Was in Wirklichkeit passiert, ist, dass alle 3 Anfragen versuchen, das neue Entity anzuhängen und mit einem SQL error: duplicate key (nicht dem genauen Wortlaut) auf der pivot Tabelle zu enden.

Das Problem ist nicht auf Eloquent beschränkt, zum Beispiel führen 3 API-Anfragen zur selben Zeit dazu, dass 3 Berichtnachrichten generiert werden und so weiter.

Was wäre der beste Weg, um dieses Problem zu beheben? Bis jetzt habe ich versucht, die DB-Anweisungen mit DB::transaction zu umhüllen, aber das schien das Problem nicht zu beheben (oder ich habe es falsch gemacht).

Vielen Dank für jede hilfreiche Antwort.

+0

Welche Art von Datenbank Sie verwenden und was ist seine Datenbank-Engine? Denken Sie daran, dass traditionelle Datenbank-Engines wie MyISAM von MySQL nicht transaktional sind, was bedeutet, dass die gesamte Tabelle gesperrt ist, während Sie auf die Ausführung der Abfrage warten. Wenn mehrere Anfragen für Ihre App üblich sind, müssen Sie möglicherweise eine transaktionale db-Engine wie InnoDB in Betracht ziehen. – LePhleg

+0

1. Was sind diese "alle 3 Anfragen"? 2. Wie senden Sie sie: erfrischende Winkelsicht? Seite im Browser schnell aktualisieren? Senden sie von drei separaten Frontend-Instanzen? – bjauy

+0

@bjauy die 3 Anfragen passieren, wenn der Benutzer die Seite im Browser aktualisiert. Verschiedene Teile der App laden ihre Daten ziemlich hoch. –

Antwort

0

Nach L5.2 source codeattach scheint den Datensatz jedes Mal in die Pivot-Tabelle einzufügen, wenn Sie es ausführen.

Eine der Lösungen könnte attach durch syncWithoutDetaching([entity_id]) ersetzen.

Noch besser wäre es aber, die Anzahl der Anfragen auf einzelne in Ihrer eckigen App zu beschränken.

+0

Ich denke, der "attach" -Fehler ist nur ein Symptom von Laravel, das alle drei gleichzeitig ausführt, was auch der Grund ist, warum 3 Report-Nachrichten generiert werden und so weiter. Die Begrenzung der Anzahl der Anfragen ist auch keine Lösung, da nichts den Benutzer davon abhält, mehrere Registerkarten zu öffnen und die Seite zu aktualisieren. –

0

Am Ende habe ich einen Laravel Befehl Erstellen endete, die im Hintergrund läuft immer:

while(true) { 
     updateUnitsExample(); 
     $this->info('Units updated for time '. date("H:m:s")); 
     sleep(1); 
} 
+0

Oder Sie können das Update in den Hintergrund laden [Warteschlangen] (https://laravel.com/docs/5.2/queues). – bjauy