2017-05-04 4 views
0

外部ソースからの複数のリクエスト(POSユニットからの請求書)を受け取るアプリケーションがあります。それは毎秒数十の要求を受け取り、それらの要求のいくつかは同じです(同じ要求本体を持っています)。複数の挿入/更新でユニークキーの例外が発生する

要求データは、関連する2つのテーブル(外部キー)に変換されて保存されます。レコードがすでに存在する場合(ユニークな複合キーによって照会された場合)、レコードが更新されます。それ以外の場合はレコードが追加されます。

問題は、同じボディを持つ、時にはもし2つの要求を同時にアプリは一意のキーがすでに存在することを例外をスローし、それを挿入することはできませんで受信されていることである。

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 

それはおそらく、レースの一部のようなものですMySQLの状態ですが、それを把握することはできません

全体のプロセスはラーベルトランザクションでラップされています。私は別の分離レベルを設定しようとしました。 SERIALIZABLEはその問題を解決しますが、デッドロックの例外が多く発生し、時にはレコードが保存されないことがあります。

答えて

0

これはここで起こるものを、簡単です、あなたは「UNIQUE」または「主キー」またはそのような何か、そしてあなたが再び挿入しようとしている、それは挿入をブロックしていますいくつかの重要な制約として宣言され、いくつかの値を持っている、これはする必要がありますデータベースのエントリが重複するのを避けますが、挿入しようとしているデータがすべての列ではなくデータベースに存在する場合、キーやキーの組み合わせを尋ねる必要があります。もしデータやテーブルがわからないのであれば、もっと助けてください。

+0

この部分以外は丁寧に答えてください。 "あなたが挿入しようとしているものがデータベースに存在するかどうかチェックする必要があります、 " これは間違っています。適切なアプローチは、データベースがそれを処理し、スローされた例外をキャッチすることです。 – e4c5

+0

あなたはそうです、多くのデータがあれば、これは多くの時間がかかることがあります。ちょっと調べてみてください。ちょっとした時間がかかるかもしれません。単純な解決策はhttps:/ /laracasts.com/discuss/channels/eloquent/eloquent-trycatch-on-duplicate-key-exception-and-delete – aasanchez

+0

@aasanchez私が質問に書いたように、レコードが存在する場合は、レコードが存在するかどうかを確認しています。私は何らかの競合状態が起こったと思うし、同じレコードが両方同時に挿入しようとすると、何らかの理由でチェックがスキップされてしまいます。 –

関連する問題