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 Entity
attached()
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.
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
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
@bjauy die 3 Anfragen passieren, wenn der Benutzer die Seite im Browser aktualisiert. Verschiedene Teile der App laden ihre Daten ziemlich hoch. –