【发布时间】:2021-10-28 06:20:55
【问题描述】:
假设我们有一个 API 来订票。控制器方法有两种,一种是检查座位是否已被预订,另一种是预订座位。如果两个用户同时尝试预订同一个座位,那么第一种方法将允许预订座位。它现在将如何处理座位预订,在多个线程中并行运行请求?
【问题讨论】:
-
一旦座位被预订,您的 api 将阻止该座位。因此,任何对该方法的调用都将返回错误/阻塞或剩余如果您还有很多剩余。
-
您可以为此使用锁定机制(例如乐观锁定)。
-
听起来像是某种竞争条件。理论上,所有线程都将争夺同一个席位。让预订系统线程安全可能值得考虑。
-
如果你想获得技术,还要考虑单个操作系统线程仍然可以使用协程处理多个同时请求(即
async await用于 IO)。虽然是的,但 ASP.NET Core 使用了多种技术,包括 IIS 在HTTP.SYS中未充分记录的 voodoo、.NET 的线程池(IIS 使用较低的默认线程堆栈大小顺便说一句,因此它可以拥有比正常更多的线程)和异步 IO。 -
对您的问题的快速、简短和简单的回答是,您的持久性存储(通常是 SQL RDBMS)将负责确保事务正确性 :它将自行处理事务(前提是您正确使用
BEGIN TRANSACTION和COMMIT)。否则你的数据库状态将被破坏(实际上所有主要的 RDBMS 都能很好地处理这个问题,你只需要注意你是否自己做 IO,就像你正在写入一个简单的文本文件或类似文件一样)。
标签: c# asp.net-core webrequest