如何防止MVC控制器中的并发访问?

时间:2014-05-30 16:58:33

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

我有一个可在特定URL访问的MVC控制器,在调用时会运行一系列耗时的过程(从数据库后处理数据)。

我需要确保当用户调用该方法时,该过程开始一次。如果任何其他用户在后处理运行时访问该特定URL,则不会同时进行后处理。

我的问题:

  • 我应该在C#中使用locks吗?
  • 我应该在DB中使用一些像inProgress标志,这样我可以在处理开始和结束时进行标记吗?
  • 还有其他解决方案吗?

3 个答案:

答案 0 :(得分:5)

如果要扩展到多台计算机,则内存锁不是一个选项,但数据库中的锁可能是最简单的。

例如,您可以创建一个具有唯一ID字段的锁定表。当您收到请求时,尝试插入ID为1的行。如果成功,则后处理并删除密钥。

在另一次运行期间尝试在密钥存在时插入密钥的任何其他请求将使插入失败并且不运行该作业。

答案 1 :(得分:3)

每个并发请求都有自己的线程。

这是使线程安全所需的正在进行的任务集。该资源将是共享的,因此多个Web请求将同时尝试访问。

.Net 4.0以后有并发集合,让您的生活更轻松。你需要的是一个并发集,但不存在这样的类。您可以使用ConcurrentDictionary,只使用请求ID的密钥。

这假设您只有一个Web服务器,否则您将需要数据库或共享服务解决方案。

答案 2 :(得分:2)

更确切地说:它们是线程安全的,因为控制器是为每个请求创建的。 2个请求不共享一个控制器。