【问题标题】:How to handle duplicate data or avoid clashes?如何处理重复数据或避免冲突?
【发布时间】:2015-05-19 09:53:52
【问题描述】:

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

例如, 用户 A、B 和 C 正在尝试在以下时间预订 Location-A。

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

用户 B
=> 17/03/2015 11:00 至 12:00
=> 18/03/2015 10:00 至 12:00

用户 C
=> 17/03/2015 11:30 到 13:30

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

【问题讨论】:

  • 除非另有编码,否则最后获胜。您可以使用时间戳之类的东西 - 如果您更新记录并且您用于更新的对象的时间戳和正在更新的记录的时间戳不匹配,那么在最后一次读取的时间和当前更新。 LINQ to SQL 能够做类似的事情 - EF 可能也是如此。
  • 嗨,蒂姆,感谢您的 cmets。我也是这样想的。服务器端的每个资源都会有“最后更新的日期时间”,并且当他们访问资源时需要保留在客户端站点中。系统需要在进行任何更改之前对其进行比较。我们担心的是,如果用户同时访问资源,他们可能会获得相同的价值。

标签: c# asp.net sql-server visual-studio asp.net-mvc-4


【解决方案1】:

这里至少涉及2个业务流程。

  • 流程一:

显示可用座位。

  • 流程二:

预订位置。

由于这些进程不会无节制地相互跟随,并且由于 2 个人可能会选择相同的位置 A,因此会出现并发问题。

如果您的数据库设计分配了正确的唯一性约束,那么以下组合:

-位置ID

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

是唯一的,那么数据库将防止重复。

以下情况也是可能的,但将由上述建议的实现来处理:

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

  1. User1 显示可用资源(并获取 => 17/03/2015 10:00 到 12:00 位置 A)
  2. User2 显示可用座位(并获得 => 17/03/2015 10:00 到 12:00 位置 A)
  3. User1 与电话交谈了一下​​
  4. User2 去书(2015 年 3 月 17 日 10:00 地点 A)
  5. 用户 1 尝试预订(2015 年 3 月 17 日 10:00 位置 A)(因为它在他的屏幕上显示为可用)
  6. 唯一索引可防止第 5 步交换数据。

因此,您需要做的可能只是正确的数据库设计和正确的约束选择。

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

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

【讨论】:

  • 嗨,Dabhi,感谢您的回答。我们不想为用户保留插槽。这有点像先进先出。第一个预订的人可能会赢得这个位置。这就是为什么多个用户可以在同一时间预订同一个时段的原因。我们需要在后端进行并发检查。再次感谢您的回答。它给了我们一些想法。 (Y)
猜你喜欢
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 2011-07-02
  • 2018-02-03
  • 1970-01-01
相关资源
最近更新 更多