ムービーでのチケットの予約を考えてください。 x個のオープンシートがあります。あなたがサイトに来ると、ある期間座席の1つを予約したいと思います。シアターシートの予約
私はプライベート内部APIとパブリックAPIを持っています。パブリックAPIは、内部APIを呼び出し、そのシートを「予約中」ステータスにすることによって、座席予約を求めるアプリケーションに応答します。
私の問題は、同じ席を予約している人が2人いることがあり、その結果、1人がすべての情報を入力してから登録を完了できなくなるということです。
私はコードのスレッドを安全にしようとしましたが、同じシートの奇妙な重複割り当てがまだ残っています。
私は、次のような私の「予約」方式から、私のステータス更新を呼び出しています:
VisitStatusChangeResult visit_status_change_result = await ReserveSlotByLockedStatusUpdate(first_empty_seat);
これで私はSemaphoreSlimを使用してにスレッドsafteyを追加しようとしているステータス更新方法:
private static SemaphoreSlim m_ReserveOnlineSlotStatusUpdateSemaphore = new SemaphoreSlim(initialCount: 1, maxCount: 1);
private async Task<VisitStatusChangeResult> ReserveSlotByLockedStatusUpdate(VisitQueryResult first_empty_seat)
{
await m_ReserveOnlineSlotStatusUpdateSemaphore.WaitAsync();
try
{
return await ChangeStatus(new VisitStatusUpdateModel
{
VisitID = first_empty_seat.ID,
CurrentVisitStatusID = first_empty_online_visit.VisitStatusID,
NewVisitStatusID = (int)VisitStatuses.BeingBooked
});
}
finally
{
m_ReserveOnlineSlotStatusUpdateSemaphore.Release();
}
}
SemaphoreSlimを使用していても、2人で同じ席を掴むことができます。
予約情報をデータベースに保存していますか?はいの場合、そのような状況が発生するのはなぜ(データベースレベルで)許可されていますか? – Evk
はい、「BeingBooked」に設定されているものである 'VisitStatusID'のfkを持つデータベース内の行は、それぞれ1つの行です。クライアントが座席を予約するか、予約アプリケーションを終了するか、時間がなくなる。 – Mark