【问题标题】:How to ensure that tickets will not be sold more than allowed? [closed]如何确保门票不会超过允许的销售量? [关闭]
【发布时间】:2019-05-01 21:21:07
【问题描述】:

售票公司如何保证不再售票?

例如,您有 40 个可用并已售出 39 个,同时有 2 个人开始购买,两个人都会有该票可用的信息,但是一旦一个人完成购买,另一个人仍然有有票的虚假信息,购买不会被阻止。

如何解决?

【问题讨论】:

  • 这是典型的race condition problem 有一些技术例如database locks。这取决于你的环境
  • 事务处理
  • 当第 1 个人按下购买按钮时,即使销售尚未完成,门票也会被标记为已售出。如果第 2 个人按购买,她会发现它已经售出。如果第 1 个人没有在设定的时间内完成购买,则删除 Sold 标志并取消购买。
  • 我投票结束这个问题,因为它与编程无关

标签: c# mysql .net-core entity-framework-core e-commerce


【解决方案1】:

一旦有人进入购买工作流程,就将该票标记为不可用(某种到期,可能是 20 分钟),以便其他购物者也无法购买该票。如果第二位购物者尝试进入购买流程,请告诉他们该票已售罄。

“进入采购流程”被定义为“关键部分”,一次只允许一个人进入。两个人不可能同时领取最后一张票。

当第一个人购买时,永久减少可用门票。如果第一个人取消购买或放弃工作流程,则将保留的票释放回可用池中。

【讨论】:

  • 就是这样。从技术上讲,这个问题在 1960 年代 - 航空公司预订系统(基于 IBM 的 CICS、IMS/DC)中得到了解决。
【解决方案2】:

不确定您希望得到什么样的答案,在数据库端还是 c# 端。 无论如何,c# 端应该非常简单,看起来像:

 private void Order_bt_Click(object sender, RoutedEventArgs e)
    {

        DataTable data = ReadDataFromDB();

        if (data.Rows.Count <= 40)
        {
            // reserve the ticket to a person
        }
        else
        {
            MessageBox.Show("Sorry, the show is sold out");
        }

    }

【讨论】:

  • 这意味着:该节目几乎不会售罄。这就是你想要的吗?
  • 至少他试过了。谢谢,但这不适用于同时购买。
  • rf1234,请问为什么?如果每次购买都记录在数据库中,最终将售出最大可用门票。除非我遗漏了什么……
猜你喜欢
  • 1970-01-01
  • 2012-07-07
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多