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

时间:2015-03-17 04:08:33

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

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

例如, 用户A,B和C正在尝试按下列时间预订位置A.

用户A
=> 17/03/2015 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.非常感谢您的建议,我们非常感谢。

1 个答案:

答案 0 :(得分:2)

此处涉及至少2个业务流程。

  • 流程一:

显示可用座位。

  • 过程二:

预订位置。

由于这些过程并不是无关紧要的,因为2个人可能会选择相同的Location-A,因此会出现并发问题。

如果您的数据库设计指定了正确的唯一性约束,那么组合:

-LocationID

-TimeStamp(例如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. User1尝试预订(2015年3月17日10:00地点A)(因为它在屏幕上显示为可用)
  6. 唯一索引可防止步骤5转换数据。
  7. 所以你需要做的就是没有更正确的数据库设计和适当的约束选择。

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

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