ASP.NET MVC是否在队列中或同时执行请求

时间:2014-05-14 16:21:49

标签: c# asp.net asp.net-mvc

假设我有一个带有“UpdateRecord(int recordID)”方法的控制器。这个方法只能更新给定记录一次(通过设置适当的值来记录在数据库中,让我们说它的列是“IsLock”)。为了检查它,我做了:

  1. 从数据库下载具有给定recordID的记录。
  2. 检查记录是否将“IsLock”值设置为FALSE。
  3. 如果IsLock == FALSE - 更新数据库中的记录并将IsLock设置为TRUE,否则 - 不要更新并返回错误。
  4. 所以现在我想知道如果我对这个方法(具有相同的recordID)执行两个AJAX请求,那么会发生什么。 ASP.NET会在第一次请求执行后执行第二个请求吗?或者它会同时执行吗?

    为了澄清更多信息,请告诉我这种情况是否可行:

    1. 我先请求(recordID = 555)。
    2. 一毫秒后我做了第二次请求(recordID = 555)。
    3. 首先请求下载记录,给定记录ID = 555,检查IsLock = FALSE,因此它开始准备查询以更新记录。
    4. 第二个请求已下载记录,给定记录ID = 555,检查IsLock = FALSE,因此它开始准备查询更新记录(IsLock stilL FALSE,因为第一个请求没有足够的时间来更新数据库)。
    5. 首先请求成功更新记录。
    6. 第二个请求成功更新了记录(但它应该返回错误,因为一条记录只能更新一次)。
    7. 如果可以,请告诉mi我如何保护我的方法以防止这种情况发生?

1 个答案:

答案 0 :(得分:2)

首先,它不仅由您的应用程序定义,还由IIS设置定义。我认为this article会有所帮助。

要回答ADO.net部分 - 有几种类型的数据并发控制,您可以阅读有关差异的here (Data Concurrency in ADO.NET)并使用适合您的情况。

在您使用锁的情况下,您将从

更改查询
update T set IsLock = 1 where recordID = 555

update T set IsLock = 1 where recordID = 555 and IsLock = 0

并检查cmd.ExecuteNonQuery()的返回值为1或0。

如果返回0,则记录未更新,锁定由其他用户等设置。

您可能还想在表格中添加LockerID字段,以便查询

update T set IsLock = 1, LockerID = @userID where recordID = @recordID and IsLock = 0

因此,当打开记录时,您将首先执行锁定查询,如果成功,您将加载记录并显示编辑模式,否则显示只读模式。