質問: productInfo.SkuCode)) AddProductSku(); ``` このビジネスロジック関数を呼び出す複数のスレッドがあります。何が起こるか: 関数が同じパラメーターで同時に呼び出された場合、両方のインスタンスはレコードが存在するかどうかをチェックし、存在しない場合はチェックします。したがって、両方のインスタンスが同じレコードを挿入します。 context.SaveChanges()が最初のインスタンスで呼び出されると、すべてが正常になります。しかし、2番目のSaveChanges()はレコードが既に存在するため、例外をスローします(データベースに一意のインデックスがあります)。 例外を避けるためにこれを実装するにはどうすればよいですか? 私はロック{}を使って解決しましたが、私は望んでいないボトルネックを作りました。 ありがとうございました。
回答: 私たちはこの同じ問題に対処しなければなりませんでした。あなたのコードにロックを実装したくない場合は、本当に良い回避策はありません。また、新しい行がデータベースに入るための複数の方法がないか、将来的には存在しないことを確認する必要があります。 私たちがやっていることは、例外メッセージを評価することです。重複キーエラーであれば、例外を単に食べます。実際には、行が存在するかどうか最初に確認することさえありません。とにかくSQL Serverはこれを行います。それで、私たちが挿入を行うたびにシークを節約します。このアプローチは、私たちと私たちのアプリケーションに有効です。挿入後に何をしたいかによっては、すべての場合に機能する場合と動作しない場合があります。