質問: dbContext.Appointments.Where(...).AnyAsync(cancellationToken); if (calendarSlotExists && !appointmentsAreOverlapping) dbContext.Appointments.Add(...); dbContext.SaveChangesAsync(cancellationToken); } } ``` 同時実行性の問題を常に防ぐ最良の方法は何ですか?また、最終的なデッドロックをどのように処理する必要がありますか?
回答: データベースの整合性チェックはあなたの親友です 説明に基づいて、予定はスロットに基づいています。 `Appointments`テーブルで`SlotId`一意の制約を効率的に定義できるため、これにより問題がはるかに簡単に`SlotId`ました。そして、 `Appointments.SlotId` `Slot.Id`参照するための外部キーが必要になります。 > 1で取得したカレンダースロットがステップ3の前に削除された場合はどうなりますか? > > DBは外部キー違反例外をスローします > ステップ2の後、ステップ3の前に別のアポイントメントが予約された場合はどうなりますか? > > DBは重複キー例外をスローします 次に行う必要があるのは、これらの2つの例外をキャッチし、ユーザーを予約ページにリダイレクトすることです。 DBからデータを再度リロードし、無効なエントリがないか確認し、変更を行うようユーザーに通知して再試行します。 デッドロックの部分については、実際にテーブル構造に依存します。データにアクセスする方法、データにインデックスを付ける方法、およびDBのクエリプラン。それに対する決定的な答えはありません。