C# 在ASP.NET中处理从多个会话到数据库的多个插入

C# 在ASP.NET中处理从多个会话到数据库的多个插入,c#,asp.net,sql-server,session,ado.net,C#,Asp.net,Sql Server,Session,Ado.net,我有一个asp.net应用程序,允许用户登录并保存不同时段的约会。这是一个多用户应用程序,多个用户可以同时登录并预订约会 我有一个存储过程,它将约会时间段数据插入数据库,在选择时间段后单击save按钮时调用该数据库 当两个或多个用户试图同时在同一插槽上保存约会时,我遇到了一个问题。在这个场景中,我希望只允许一次插入,并向所有其他插入存储过程的调用返回一条错误消息 复制步骤: 用户1选择1个插槽。用户2选择与用户1相同的插槽 User1和User2-插槽的填充数据 用户1和2同时单击保存按钮 这将

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

我有一个存储过程,它将约会时间段数据插入数据库,在选择时间段后单击save按钮时调用该数据库

当两个或多个用户试图同时在同一插槽上保存约会时,我遇到了一个问题。在这个场景中,我希望只允许一次插入,并向所有其他插入存储过程的调用返回一条错误消息

复制步骤:

  • 用户1选择1个插槽。用户2选择与用户1相同的插槽
  • User1和User2-插槽的填充数据
  • 用户1和2同时单击保存按钮 这将保存用户1的数据,并在预订约会时段时向用户2显示错误


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

    乐观方式

    您可以将时间戳列添加到约会槽表中,以在多个用户同时处理同一行时保持完整性

    一旦添加了时间戳,就需要将其发送到UI,以便在更新时将其传递回DB

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

    悲观的方式

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

    有关这两种方法的更多详细信息,请检查此项。

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


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

    什么不起作用?默认情况下,SQL Server使用乐观并发。所以你应该得到一个并发异常。在创建记录之前,我会让存储过程或你的代码检查时隙是否仍然可用。如果可能的话,可能是插槽数据类型的唯一约束?谢谢你的解决方案…采用了悲观的方式。那篇文章读得很好!