您是否在Web应用程序中使用锁定?

时间:2009-04-23 12:48:33

标签: c# asp.net

发布此问题后:

How to lock on an integer in C#?

许多答案让我觉得我是在网络应用程序中使用锁定的“罪人”。我从没想过这是一个问题(如果明智地使用),你呢?你有没有在你的网络应用程序中使用它?

我没有看到如何在没有锁定的情况下编写Web应用程序,例如,如果您想从数据库加载一些数据并且您希望确保没有其他线程将加载它(也适用于单例),通常你使用锁定,例如:

private _locker =  new object();
private YourClass[] _data;
public YourClass[] Data
{
    get
    {
        if(_data == null)
        {
            lock( _locker)
            {
                // get your data
               _data = GetYourData();
            }
        }
        return _data;
    }
}

这有问题吗?!

编辑:

请注意,我在这里指的是单一服务器场景,对于服务器场,您需要一些分布式锁定机制,但是您不希望您创建的每个站点在几周内获得数百万次点击,您?如果您需要锁定,如果您使用该分布式锁定创建您的站点,对于您不知道是否需要缩放的应用程序而言,这并不是太多了?除了电脑现在变得非常快,一台服务器可以处理大量的流量,这已经被证明了很多次,一些例子是lotsoffish.com和你现在正在使用的这个网站,做一些谷歌搜索,我敢肯定你会遇到很多其他人。

6 个答案:

答案 0 :(得分:11)

如果您使用锁来尝试控制对远程资源的访问(例如,来自数据库的某些内容),那么当您尝试扩展到更多服务器时,您将遇到问题。

如果您只想拥有AppDomain特定的锁(例如缓存),那么它就非常有意义。

我不同意你暗示的断言,即Web应用程序无法在没有锁定的情况下编写(在Web服务器级别)。它实际上取决于应用程序 - 通常数据库争用是在数据库而不是Web服务器上处理的,因此您可以在Web层中拥有多台计算机。

对于单身人士而言,它具有一定的意义,但无论如何我很少使用单身人士......

答案 1 :(得分:3)

是的,您需要再次检查数据。被称为双重检查锁。 http://en.wikipedia.org/wiki/Double_checked_locking_pattern

理论上,在创建锁之前,第二个线程可能会超过您的第一个空检查。

    if(_data == null)
    {
        lock( _locker)
        {
            if (_data == null) {
              // get your data
              _data = GetYourData();
           }
        }
    }

在网络应用中这样做的好主意,除非你真的,真的知道你在做什么。

我会查看可升级锁定http://msdn.microsoft.com/en- us/library/system.threading.readerwriterlockslim.enterupgradeablereadlock.aspx

答案 2 :(得分:2)

我不知道你是如何进行数据访问的,但我从未发现只需要为一个请求锁定数据库。我不确定,但我可以想象你会尝试解决Microsoft Access数据库的某些问题,但这只是因为它不是一个好的数据库系统用于网站(或任何离开本地桌面的东西)。

答案 3 :(得分:1)

在请求中的某个时刻锁定本地竞争资源很好(尽管很少见)。锁定请求并尝试在多个请求中保持锁定并不会真正起作用。即使您可以在单一服务器环境中使用它,如果您必须扩展到多服务器环境,那么它就不会按照您期望的方式工作。

答案 4 :(得分:0)

您尝试访问的远程资源应该负责锁定。正如有人已经指出的那样,锁是整个流程的,一旦你扩展锁定就会失败。

数据库也应该完成你需要的所有锁定。这是DBMS的主要要求之一:数据完整性。

答案 5 :(得分:0)

我从来不需要在任何webapps上使用任何同步机制。除非您正在处理多个会话正在发生变化的原始XML文件,否则我无法看到它。像大多数人一样说 - 你的数据库将为你照顾。更新,查询,你有什么,数据库系统(至少你可能会使用ASP.NET)为你做好同步。