gpt4 book ai didi

c# - ASP.NET MVC 是在队列中还是同时执行请求

转载 作者:太空狗 更新时间:2023-10-29 21:54:05 25 4
gpt4 key购买 nike

假设我有一个带有方法“UpdateRecord(int recordID)”的 Controller 。此方法应该只更新给定记录一次(通过设置适当的值记录在数据库中,假设它是“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 仍然是 FALSE,因为第一个请求没有足够的时间更新数据库)。
  5. 第一次请求成功更新记录。
  6. 第二次请求成功更新记录(但应该返回错误,因为一条记录只能更新一次)。

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

最佳答案

首先,它不仅由您的应用程序定义,而且由 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

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

关于c# - ASP.NET MVC 是在队列中还是同时执行请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23660114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com