处理ASP.NET中多个会话对数据库的多个插入

时间:2018-02-25 12:55:53

标签: c# asp.net sql-server session ado.net

我有一个asp.net应用程序,允许用户登录并保存不同时段的约会。它是一个多用户应用程序,多个用户可以同时登录并预约约会。

我有一个存储过程,它将约会插槽数据插入到数据库中,在选择插槽后单击保存按钮时调用该数据库。

当两个或更多用户同时尝试在同一个插槽上保存约会时,我遇到了问题。在这种情况下,我想只允许一个插入并向所有其他调用返回错误消息以插入存储过程。

重现的步骤:

  1. 用户1选择1个插槽。用户2选择与用户1相同的插槽。
  2. 用户1和用户2 - 填充广告位的数据
  3. User1和2同时单击“保存”按钮。
  4. 这应保存用户1的数据,并在预约预约时段时向用户2显示错误。

    简而言之,我想只允许执行一次存储过程并将错误返回给所有其他插入。

2 个答案:

答案 0 :(得分:1)

乐观的方式

您可以将时间戳列添加到约会广告位表,以便在多个用户同时处理相同的行时保持完整性。

添加时间戳后,您需要将其添加到UI,以便在更新时将其传递回数据库。

更新行时,如果时间戳相同,则继续执行事务,如果时间戳已更改,则需要回滚事务。

悲观的方式

当有人想要预订时锁定插槽,以便其他人无法打开它进行预订,唯一的问题是,当有人在没有任何交易的情况下关闭应用程序时,您需要通过一些后台逻辑解锁它

有关这两种方法的详细信息,您可以查看article

答案 1 :(得分:0)

如果 timeSlot 是主键或具有唯一约束,则SQL会为您执行此操作。你应该这样设计它。

如果要从存储过程返回消息,可以在尝试插入之前检查主键。