同步c#/asp.net预订应用程序

同步c#/asp.net预订应用程序,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我正在开发一个活动预订应用程序,很难弄清楚如何管理预订过程。我了解数据库事务和一点锁定,但在提交预订之前,我有很多业务规则需要验证,我担心性能瓶颈 以下是所发生情况的摘要: 一个事件具有最大插槽数 用户可以在活动中预订一个地点 每个用户都有一个帐户,每个活动都有一定的费用 鉴于上述参数,我需要验证以下业务规则才能进行预订: 用户尚未预订此活动的场地 用户有足够的资金预订活动 活动至少有一个地点可用 该事件与用户预订的其他事件没有冲突(问题不大,因为我可以在显示页面时对此进行检查,并向用户隐

我正在开发一个活动预订应用程序,很难弄清楚如何管理预订过程。我了解数据库事务和一点锁定,但在提交预订之前,我有很多业务规则需要验证,我担心性能瓶颈

以下是所发生情况的摘要:

  • 一个事件具有最大插槽数
  • 用户可以在活动中预订一个地点
  • 每个用户都有一个帐户,每个活动都有一定的费用
鉴于上述参数,我需要验证以下业务规则才能进行预订:

  • 用户尚未预订此活动的场地
  • 用户有足够的资金预订活动
  • 活动至少有一个地点可用
  • 该事件与用户预订的其他事件没有冲突(问题不大,因为我可以在显示页面时对此进行检查,并向用户隐藏此事件)
我主要担心的是,如果我提前从db中提取所有信息(即事件、用户、帐户和现有预订),那么当我运行所有验证并提交新预订时,系统的状态可能已经改变(即,其他人已经预订了最后一个位置,钱已经离开了我的帐户,等等)

如果我要在这个预订过程中锁定代码/数据库表,那么我可能会在相当长的一段时间内获得锁,同时影响系统中的其他操作,并在高峰时间导致性能问题

有谁能建议一种方法,让我能够管理或至少限制这些顾虑


我正在用c#和sql server 2005构建一个asp.net应用程序。

我认为一个很好的例子是Ticketmaster如何为可能购买的门票预留座位。他们告诉你,你有那么多的时间,直到把座位放回库存。它促使购买者做出决定,否则其他人将有机会坐上座位。这确实是你最大的障碍。至于检查业务规则,你必须这样做。需要在那里做的事情没有什么神奇之处。如果您需要数据来验证规则,那么这就是您需要做的。通过适当的映射和概述,您可以找到效率。我希望这回答了你的问题


祝你好运

我认为一个很好的例子是Ticketmaster如何为可能购买的车票预留座位。他们告诉你,你有那么多的时间,直到把座位放回库存。它促使购买者做出决定,否则其他人将有机会坐上座位。这确实是你最大的障碍。至于检查业务规则,你必须这样做。需要在那里做的事情没有什么神奇之处。如果您需要数据来验证规则,那么这就是您需要做的。通过适当的映射和概述,您可以找到效率。我希望这回答了你的问题

祝你好运

一种解决方案:

  • 提前预订现货(状态为“持有”)
  • 验证
  • 如果由于业务规则无法保留预订,请将其删除。如果没有,请将状态更改为“已预订”
  • 一个解决方案:

  • 提前预订现货(状态为“持有”)
  • 验证
  • 如果由于业务规则无法保留预订,请将其删除。如果没有,请将状态更改为“已预订”

  • 如果你回到80年代,阅读有关交易处理的文献,你会发现讨论最多的例子之一是航空订票系统。这是一个很好的理由,因为它是OLTP主题之一,揭示了事务处理的所有问题:正确性、troughput、争用、死锁。你所描述的是一个非常相似的问题,但是你没有飞机座位,而是有活动时段。所以,是的,你会有所有这些问题

    没有神奇的精灵尘埃。这是一个难题。但有一些指导方针:

    • 健忘的弗雷德不能永远锁定插槽。健忘的Fred是一个用户,他打开预订屏幕,选择一个座位,然后在没有完成交易的情况下去吃午饭。如果允许,则系统将缓慢“泄漏”未使用的插槽
    • 数据库锁太昂贵,在等待用户输入时无法持有
    • 只有使用细粒度锁才能实现吞吐量
    • 业务逻辑不应尝试对相关项进行一致更新
    • 向用户显示的所有内容都应视为“暂定”
    • 用户界面应准备好处理更新冲突
    • 更新逻辑应始终遵循相同的层次结构(例如,如果约定的更新逻辑为Account->User->Event->Booking,则试图更新Booking->Event->User的恶意交易将导致死锁)

    事实上,有一种方法可以限制这些担忧:以这种杠杆为后盾。当然不是你每天的ASP任务,所以我建议你坚持你所知道的。

    如果你回到80年代,阅读有关事务处理的文献,你会发现讨论最多的例子之一是航空公司预订系统。这是一个很好的理由,因为它是OLTP主题之一,揭示了事务处理的所有问题:正确性、troughput、争用、死锁。你所描述的是一个非常相似的问题,但是你没有飞机座位,而是有活动时段。所以,是的,你会有所有这些问题

    没有神奇的精灵尘埃。这是一个难题。但有一些指导方针:

    • 健忘的弗雷德不能永远锁定插槽。健忘的Fred是一个用户,他打开预订屏幕,选择一个座位,然后在没有完成交易的情况下去吃午饭。如果允许,则系统将缓慢“泄漏”未使用的插槽
    • 数据库lo