質問: null) { await _dbContext.Devices.AddAsync(new Device(imei)); await _dbContext.SaveChangesAsync(); } else { throw new ConflictException($"Device with IMEI '{imei}' already exists"); } return Ok(); } ``` 再現するのは難しいですが、時々 > 23505:重複キー値が一意制約\ "devices_imei_key \"に違反しています > > `device`はnullのようですが、 `SaveChanges`時点ではすでにnullではありません。 `try...catch`を使用しないようにするにはどうすればよいですか? `AsNoTacking()`を使用して、データベースからの読み取りを改善できますか?
回答: これは基本的な並行性であり、いつものように、並行性を処理するための特定の戦略が必要です。セマフォを使用して一度に1つのリクエストのみがパイプラインを通過できるようにロジックをゲートしない限り、現在使用しているメソッドは不十分です。これは並行性の問題を回避しますが、アプリケーションにチョークポイントを作成するため、明らかにパフォーマンスに影響を与えます。 一意の制約があるため、ここでの最善策は、コードをtry / catchでラップし、実際に直面しているシナリオを処理することです。各IMEIには1つのエントリしかないので、catchブロックのelseブロックで行っているのと同じことを行うことができます: `ConflictException`返します。 この特定の問題については、ロックを追加するか、例外を処理(try / catchを使用)する以外のオプションはありません。どれだけ「速く」行っても問題ありません。同時実行の競合が発生する可能性は*常に*存在するため、それに対処する必要があります。