【问题标题】:Handling multiple inserts to database from multiple sessions in ASP.NET在 ASP.NET 中处理从多个会话到数据库的多个插入
【发布时间】:2018-08-05 00:48:19
【问题描述】:

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

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

当 2 个或更多用户尝试同时在同一个位置保存约会时,我遇到了问题。在这种情况下,我希望只允许一次插入,并向所有其他插入存储过程的调用返回一条错误消息。

重现步骤:

  1. 用户 1 选择 1 个插槽。用户 2 选择与用户 1 相同的插槽。
  2. User1 和 User2 - 填充槽的数据
  3. 用户 1 和 2 同时单击保存按钮。

这应该保存用户 1 的数据,并在预约空档时向用户 2 显示错误。

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

【问题讨论】:

  • 什么不起作用? SQL Server 默认使用乐观并发。所以你应该得到一个并发异常。
  • 我会让存储过程或您的代码在创建记录之前检查时间段是否仍然可用
  • 如果可能的话,可能是对 Slot 数据类型的唯一约束?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    乐观的方式

    您可以在预约空档表中添加时间戳列,以在多个用户同时处理同一行时保持完整性。

    添加时间戳后,您需要将其获取到 UI,以便在更新时将其传递回 DB。

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

    悲观的方式

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

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

    【讨论】:

    • 感谢您的解决方案...采用悲观的方式。那篇文章很好读!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    相关资源
    最近更新 更多