gpt4 book ai didi

c# - 预订剧院座位

转载 作者:行者123 更新时间:2023-12-03 13:03:46 24 4
gpt4 key购买 nike

想想看电影订票。有x个空位,你来现场,我想预留一个位子,预留一段时间。

我有一个私有(private)内部 API 和一个公共(public) API。公共(public) 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 等待,我也可以让两个人坐在同一个座位上的东西?

最佳答案

首先,使用内存锁来保护对数据库资源的并行访问并不是一个好主意——每个数据库都有自己的工具来处理这些事情。在这种情况下,您很可能必须使用乐观并发,大致如下:

update Visit set VisitStatusID = BeingBooked, ClientID = CurrentClientID where VisitStatusID = Free

所以你知道谁现在预订了这个座位,而且,如果发生这种情况,这个座位已经不是空闲的——这个语句将返回 0(修改了 0 行)。您应该对此进行检查并采取相应措施(通知客户该席位已被占用并刷新席位)。

其次,你的锁无论如何都没有效果。没有什么可以阻止两个客户调用 ReserveSlotByLockedStatusUpdate依次,一个接一个,仍然遇到麻烦,因为它们都会保留同一个席位(除非您像上面那样实现乐观并发)。

关于c# - 预订剧院座位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40491168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com