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

And*_*zej 6 c# asp.net asp.net-mvc

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

  1. 从数据库下载具有给定recordID的记录.
  2. 检查记录是否将"IsLock"值设置为FALSE.
  3. 如果IsLock == FALSE - 更新数据库中的记录并将IsLock设置为TRUE,否则 - 不更新并返回错误.

所以现在我想知道如果我对这个方法(使用相同的recordID)执行两个AJAX请求,那么会发生什么.ASP.NET会在第一次请求执行后执行第二个请求吗?或者它会同时执行吗?

为了更清楚地说明,请告诉我这种情况是否可行:

  1. 我先请求(recordID = 555).
  2. 一毫秒后,我做第二次请求(recordID = 555).
  3. 首先请求下载记录,给定recordID = 555,检查IsLock = FALSE,因此它开始准备查询以更新记录.
  4. 第二个请求下载记录,给定recordID = 555,检查IsLock = FALSE,因此它开始准备查询更新记录(IsLock是stilL FALSE,因为第一个请求没有足够的时间来更新数据库).
  5. 首先请求成功更新记录.
  6. 第二个请求成功更新记录(但它应该返回错误,因为一个记录只能更新一次).

如果可能,请告诉mi我如何确保我的方法以防止这种情况发生?

vit*_*ore 2

首先,它不仅由您的应用程序定义,还由 IIS 设置定义。我认为这篇文章会有帮助。

要回答 ADO.net 部分 - 有多种类型的数据并发控制,您可以在此处阅读(ADO.NET 中的数据并发) 有关差异的信息,并使用适合您情况的一种。

在您使用锁的情况下,您将更改您的查询

update T set IsLock = 1 where recordID = 555
Run Code Online (Sandbox Code Playgroud)

update T set IsLock = 1 where recordID = 555 and IsLock = 0
Run Code Online (Sandbox Code Playgroud)

并检查返回值是cmd.ExecuteNonQuery()1还是0。

如果返回 0 条记录未更新且锁定已被其他用户设置等。

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

update T set IsLock = 1, LockerID = @userID where recordID = @recordID and IsLock = 0
Run Code Online (Sandbox Code Playgroud)

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