C# 如何处理重复数据或避免冲突?

C# 如何处理重复数据或避免冲突?,c#,asp.net,sql-server,visual-studio,asp.net-mvc-4,C#,Asp.net,Sql Server,Visual Studio,Asp.net Mvc 4,我们正在尝试建立资源预订系统,用户可以在系统中预订位置或人员。多个用户可以在同一时间对同一资源进行多次预订 比如说,, 用户A、B和C正在尝试为以下计时预订位置A 用户A =>2015年3月17日10:00至12:00 =>2015年3月17日14:00至15:00 =>2015年3月18日10:00至12:00 =>2015年3月18日14:00至15:00 用户B=>2015年3月17日11:00至12:00 =>2015年3月18日10:00至12:00 用户C=>2015年3月17日11

我们正在尝试建立资源预订系统,用户可以在系统中预订位置或人员。多个用户可以在同一时间对同一资源进行多次预订

比如说,, 用户A、B和C正在尝试为以下计时预订位置A

用户A
=>2015年3月17日10:00至12:00
=>2015年3月17日14:00至15:00
=>2015年3月18日10:00至12:00
=>2015年3月18日14:00至15:00

用户B
=>2015年3月17日11:00至12:00
=>2015年3月18日10:00至12:00

用户C
=>2015年3月17日11:30至13:30


系统需要处理资源冲突,以避免同一时间重复预订或时间重叠。只有一个用户可以使用资源,其余的预订必须失败。我的问题是什么是正确的处理方法?在将数据插入表之前,我们应该使用事务锁还是表锁?我们正在使用VisualStudio2008和SQLServer2008。非常感谢您的建议,我们非常感谢

这里至少涉及两个业务流程

  • 过程一:
展示可用座位。

  • 过程二:
预定地点。

由于这些进程不会过度地相互跟踪,并且由于两个人可能会选择相同的位置,因此会出现并发问题

如果数据库设计指定了正确的唯一性约束,则:

-位置ID

-时间戳(例如10到12、15到17)

是唯一的,则数据库将防止重复

以下情况也是可能的,但将通过上述建议的实施予以解决:

假设给定剧院和给定事件的可用网格视图可以显示:

  • User1显示可用资源(并获取=>2015年3月17日10:00至12:00位置A)
  • User2显示可用座位(并获取=>2015年3月17日10:00至12:00位置A)
  • User1在电话中与用户交谈了一会儿
  • 用户2去登记(2015年3月17日10:00地点A)
  • User1尝试预订(2015年3月17日10:00位置A)(因为它在其屏幕上显示为可用)
  • 唯一索引防止步骤5交换数据
  • 因此,您所需要做的只是正确的数据库设计和对约束的正确选择

    如果需要,还可以使用事务队列使用其他更复杂的方法。在这种情况下,请求首先写入队列,然后每n秒触发一个进程,但在您的情况下,这几乎是不必要或不实际的


    真正有趣的部分是用户1的列表网格应该显示什么?

    除非另有编码,否则最后一个在wins中。您可以使用时间戳之类的东西—如果您更新了记录,并且要更新的对象的时间戳与正在更新的记录的时间戳不匹配,那么在上次读取和当前更新之间会发生一些变化。LINQ to SQL能够做类似的事情-EF也可以。嗨,Tim,谢谢你的评论。我也是这样想的。服务器端的每个资源都会有“上次更新的日期时间”,当他们访问资源时,它需要保存在客户端站点中。在进行任何更改之前,系统需要对其进行比较。我们担心的是,如果用户在同一时间访问资源,可能会获得相同的价值。嗨,大比,谢谢你的回答。我们不想为用户保留插槽。这有点像先进先出。第一个预订的人可能会赢得这个位置。这就是为什么多个用户可以同时预订相同的插槽。我们需要在后端执行并发检查。再次感谢你的回答。这给了我们一些想法。(Y)