作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
想想看电影订票。有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();
}
}
最佳答案
首先,使用内存锁来保护对数据库资源的并行访问并不是一个好主意——每个数据库都有自己的工具来处理这些事情。在这种情况下,您很可能必须使用乐观并发,大致如下:
update Visit set VisitStatusID = BeingBooked, ClientID = CurrentClientID where VisitStatusID = Free
ReserveSlotByLockedStatusUpdate
依次,一个接一个,仍然遇到麻烦,因为它们都会保留同一个席位(除非您像上面那样实现乐观并发)。
关于c# - 预订剧院座位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40491168/
如何在 HTML5 中(语义上)标记(剧院)脚本/播放? 由于显而易见的原因,如果搜索引擎不认为您指的是“播放声音”和“JavaScript”,则很难搜索“播放”和“脚本”。 我如何标记脚本(就像在给
我是一名优秀的程序员,十分优秀!