在mvc中安全使用静态锁定变量

时间:2017-01-23 14:08:26

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

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

更新

经过深入研究后,我遇到了乐观并发。我正在使用EF6以避免这种情况听起来像我需要做的就是修复Concurrency Mode

1 个答案:

答案 0 :(得分:2)

基于静态变量的解决方案看起来很有吸引力,因为它易于实现。但是,它很快就成为一种维护责任,特别是在Web应用程序环境中。

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

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

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