外部ソースからの複数のリクエスト(POSユニットからの請求書)を受け取るアプリケーションがあります。それは毎秒数十の要求を受け取り、それらの要求のいくつかは同じです(同じ要求本体を持っています)。複数の挿入/更新でユニークキーの例外が発生する
要求データは、関連する2つのテーブル(外部キー)に変換されて保存されます。レコードがすでに存在する場合(ユニークな複合キーによって照会された場合)、レコードが更新されます。それ以外の場合はレコードが追加されます。
問題は、同じボディを持つ、時にはもし2つの要求を同時にアプリは一意のキーがすでに存在することを例外をスローし、それを挿入することはできませんで受信されていることである。
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
それはおそらく、レースの一部のようなものですMySQLの状態ですが、それを把握することはできません
全体のプロセスはラーベルトランザクションでラップされています。私は別の分離レベルを設定しようとしました。 SERIALIZABLEはその問題を解決しますが、デッドロックの例外が多く発生し、時にはレコードが保存されないことがあります。
この部分以外は丁寧に答えてください。 "あなたが挿入しようとしているものがデータベースに存在するかどうかチェックする必要があります、 " これは間違っています。適切なアプローチは、データベースがそれを処理し、スローされた例外をキャッチすることです。 – e4c5
あなたはそうです、多くのデータがあれば、これは多くの時間がかかることがあります。ちょっと調べてみてください。ちょっとした時間がかかるかもしれません。単純な解決策はhttps:/ /laracasts.com/discuss/channels/eloquent/eloquent-trycatch-on-duplicate-key-exception-and-delete – aasanchez
@aasanchez私が質問に書いたように、レコードが存在する場合は、レコードが存在するかどうかを確認しています。私は何らかの競合状態が起こったと思うし、同じレコードが両方同時に挿入しようとすると、何らかの理由でチェックがスキップされてしまいます。 –