【发布时间】:2016-11-08 15:52:39
【问题描述】:
考虑在电影中订票。有x个空位,你来现场,我想预留一个位子,预留一段时间。
我有一个私有内部 API 和一个公共 API。公共 API 将通过调用内部 API 来响应寻求保留座位的应用程序,然后将该座位置于“正在预订”状态。
我的问题是我偶尔会有两个人预订同一个座位,这导致一个人输入了他们的所有信息,然后无法完成他们的注册。
我试图让我的代码线程安全,但我仍然得到同一个座位的奇怪重复分配。
我正在从我的“保留”方法调用我的状态更新:
VisitStatusChangeResult visit_status_change_result = await ReserveSlotByLockedStatusUpdate(first_empty_seat);
这是我尝试使用 SemaphoreSlim 添加线程安全的状态更新方法:
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 等待,我也可以让两个人抢同一个座位?
【问题讨论】:
-
您是否将预订信息存储在数据库中?如果是,为什么允许(在数据库级别)发生这种情况?
-
是的,每个座位都是数据库中的一排,fk 为
VisitStatusID,这就是设置为“正在预订”的内容,所以我们知道座位是保留的,直到客户预订座位,离开预订应用程序,或者他们用完了时间。
标签: c# asp.net asp.net-mvc multithreading