【问题标题】:Safe to use static lock variable in mvc在 mvc 中安全使用静态锁变量
【发布时间】:2017-01-23 14:08:26
【问题描述】:

在一个 Web 应用程序中,该应用程序会触发来自不同用户的许多 ajax 请求以执行操作。其中一个请求会触发一些数据库更新。如果当前正在进行此操作,我想确保忽略此操作的其他会话请求。实现一个我可以锁定的静态变量是否安全,这样如果一个动作已经在进行中,其他请求可以忽略该动作,或者这只是一个糟糕的设计?

更新

在深入挖掘之后,我遇到了乐观并发。我正在使用 EF6,所以为了避免这种情况,听起来我需要做的就是使用 Concurrency Mode 来修复?

【问题讨论】:

  • 为什么不“安全”?
  • 你在这里问的真的很模糊。您希望其他请求“忽略”的这个“动作”是什么?当您不“忽略”该“动作”时,当前正在发生什么?请阅读How to Ask。
  • 我没想到会这样。似乎总是在阅读以尝试在 Web 应用程序中避免静态。那么就没有问题了吗?
  • 当您的应用安装在 2 个或更多服务器上时会发生什么?你想发生什么?
  • @HenkHolterman 现在这是一个好点。如果用户已经在执行某些数据库更新,我想避免这些更新。

标签: c# entity-framework model-view-controller


【解决方案1】:

基于静态变量的解决方案可能看起来很有吸引力,因为它很容易实现。但是,它很快就会成为一种维护负担,尤其是在 Web 应用程序环境中。

Web 环境(例如 IIS)中的静态变量的问题在于,它们不会在您的整个应用程序中全局共享:如果您将应用程序池配置为具有多个工作进程,则每个进程都将拥有自己的所有静态变量的副本变量。此外,如果您为负载平衡配置基础架构,则每台服务器上的每个进程都将拥有自己的副本,而您的应用程序则无法控制。在您的情况下,这意味着可能同时发生多个更新。

这就是为什么我会避免在任何给定时间最多执行一个请求绝对关键的情况下使用静态变量。

在您的情况下,无论同时触发多少更新,持久层都应该负责不破坏数据。持久层需要决定执行哪些请求,丢弃哪些请求。解决这个问题的一种方法是乐观锁定。有关如何实施的一般信息,请参阅this Q&A。

【讨论】:

  • 我就是这么想的。在深入挖掘之后,我发现了 Optimistic Concurrency。我正在使用 EF6,所以为了避免这种情况,听起来我需要做的就是使用 Concurrency Mode 来修复?
  • @Tsukasa 是的,EF6 的乐观并发是解决这个问题的好工具。
猜你喜欢
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 2019-01-24
相关资源
最近更新 更多