2016-12-03 12 views
0

私はLaravel 5.2バックエンドと角度1フロントエンドアプリケーションを持っています。 REST APIを使用して通信します。すべてのページの読み込み時にデータベースデータを更新するコードがあります(このアプリはブラウザゲームなので、この場合プレーヤーのリソースとユニットは更新/作成されています)が、いくつかの問題が発生しています。ラーベル可能競合状態?

フロントエンドが複数のAPIエンドポイントを同時に要求する状況があります。最後の要求以降に新しいユニットが作成された場合は、Playerモデル(多対多関係)に対してEntityattached()である必要があります。現実には、3つのすべてのリクエストが新しいEntityを添付し、pivotテーブルのSQL error: duplicate key(正確な言葉ではない)で終わるようになります。

問題はEloquentと分離されません。たとえば、同時に3つのAPI要求が発生すると、3つのレポートメッセージが生成されます。

この問題を解決するにはどうすればよいでしょうか?今のところ、私はDB::transactionでDBステートメントをラップしようとしましたが、これは問題を解決していないようです(または私は間違っていました)。

ご協力いただきありがとうございます。

+0

あなたが使用していただきまして、データベースエンジンされているデータベースのどのような? MySQLのMyISAMなどの従来のデータベースエンジンはトランザクションではないことに注意してください。つまり、クエリが実行されるのを待つ間にテーブル全体がロックされます。複数のリクエストがアプリケーションに共通のものである場合は、おそらくInnoDBのようなトランザクション型dbエンジンの使用を検討する必要があります。 – LePhleg

+0

1.「すべての3つのリクエスト」とは何ですか? 2.どのように送信していますか?ブラウザのページをすばやく更新しますか? 3つの別々のフロントエンドインスタンスからそれらを送信しますか? – bjauy

+0

@bjauy 3つのリクエストは、ユーザーがブラウザでページをリフレッシュすると発生します。アプリのさまざまな部分がデータをかなり読み込んでいます。 –

答えて

0

によると、L5.2 source codeattachは、実行するたびにピボットテーブルにレコードを挿入するようです。

attachの代わりにsyncWithoutDetaching([entity_id])を使用できます。

角度アプリで1つにリクエストする量を制限する方が良いでしょう。私は、バックグラウンドで実行されます永遠Laravelコマンドを作成することになった末に

+0

'attach'エラーは、3つのレポートメッセージが同時に生成される理由である3つすべてを同時に実行するLaravelの症状に過ぎないと思います。 リクエストの量を制限することは、ユーザーが複数のタブを開いてページをリフレッシュすることを止めるものがないため、解決策でもありません。 –

0

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

また、バックグラウンド[キュー](https://laravel.com/docs/5.2/queues)への更新をオフロードできます。 – bjauy