C# 您是否在web应用程序中使用锁?
发布此问题后: 许多答案让我觉得我是一个在我的网络应用程序中使用锁的“罪人”。我从没想过这是个问题(如果使用得当),你呢?您是否在web应用程序中使用过它 我不知道如何在没有锁定的情况下编写web应用程序,例如,如果您希望从数据库加载一些数据,并且希望确保没有其他线程将加载它(也适用于单线程),通常使用锁定,例如:C# 您是否在web应用程序中使用锁?,c#,asp.net,C#,Asp.net,发布此问题后: 许多答案让我觉得我是一个在我的网络应用程序中使用锁的“罪人”。我从没想过这是个问题(如果使用得当),你呢?您是否在web应用程序中使用过它 我不知道如何在没有锁定的情况下编写web应用程序,例如,如果您希望从数据库加载一些数据,并且希望确保没有其他线程将加载它(也适用于单线程),通常使用锁定,例如: private _locker = new object(); private YourClass[] _data; public YourClass[] Data {
private _locker = new object();
private YourClass[] _data;
public YourClass[] Data
{
get
{
if(_data == null)
{
lock( _locker)
{
// get your data
_data = GetYourData();
}
}
return _data;
}
}
这有什么问题吗
编辑:
请注意,我这里指的是一个单服务器场景,对于服务器场,您需要一些分布式锁定机制,但您并不期望您创建的每个站点在几周内获得数百万次点击,是吗?如果你需要锁定,你应该用这种分布式锁定创建你的站点,对于一个你不知道是否需要扩展的应用程序来说,这不是太过分了吗?除了这些天计算机变得非常快之外,一台服务器可以处理成吨的流量,这已经被证明了很多次,一些例子是plentyoffish.com和你现在正在使用的这个网站,做一些谷歌搜索,我相信你会遇到很多其他的。如果你使用锁来控制对远程资源的访问(例如,数据库中的某些内容)那么当您尝试扩展到更多服务器时,就会出现问题 如果您只想拥有一个
AppDomain
特定的锁(例如缓存),那么它就非常有意义
不过,我不同意您暗示的web应用程序不能在没有锁定(在web服务器级别)的情况下编写的说法。这实际上取决于应用程序-通常数据库争用是在数据库而不是web服务器上处理的,正是这样,您的web层中可以有多台机器
对于单例来说,这是有一定意义的,但无论如何我很少使用单例…如果您使用锁来控制对远程资源的访问(例如,来自数据库的内容),那么当您尝试扩展到更多服务器时,您将遇到问题 如果您只想拥有一个
AppDomain
特定的锁(例如缓存),那么它就非常有意义
不过,我不同意您暗示的web应用程序不能在没有锁定(在web服务器级别)的情况下编写的说法。这实际上取决于应用程序-通常数据库争用是在数据库而不是web服务器上处理的,正是这样,您的web层中可以有多台机器
对于单例来说,这是有一定意义的,但无论如何我很少使用单例…在请求中的某个点锁定本地有争议的资源是可以的(尽管很少)。锁定一个请求并尝试在多个请求之间保持锁定实际上效果不太好。如果您必须扩展到多服务器环境,即使您可以让它在单服务器环境中工作,那么它也不会按照您预期的方式工作。在请求中的某个点锁定本地有争议的资源est很好(虽然很少见)。锁定一个请求并尝试在多个请求之间保持锁实际上不会起到太好的作用。即使您必须扩展到多服务器环境,也可以让它在单服务器环境中工作,那么它也不会按您预期的方式工作。您尝试访问的远程资源应该由您负责正如有人已经指出的,锁是进程范围的,一旦你们扩大规模,你们的锁就会失效
数据库还应该完成所有需要的锁定。这是DBMS的主要要求之一:数据完整性。您尝试访问的远程资源应该负责锁定。正如已经有人指出的那样,锁定是进程范围的,一旦扩展,锁定将无法工作
数据库还应该完成您需要的所有锁定功能。这是DBMS的主要要求之一:数据完整性。我不知道您如何进行数据访问,但我从未发现只需为一个请求锁定数据库就可以了。我不确定,但我可以想象您会尝试解决Microsoft access数据库的某些问题,但这是错误的st,因为它不是一个好的数据库系统,不能用于网站(或任何离开本地桌面的东西).我不知道您如何访问数据,但我从未发现只需要为一个请求锁定数据库。我不确定,但我可以想象您会尝试解决Microsoft access数据库的某些问题,但这只是因为它不是一个用于网站(或离开本地桌面的任何东西)的好数据库系统.是的,您需要再次检查数据。称为双重检查锁 理论上,在创建锁之前,第二个线程可以通过第一个空检查
if(_data == null)
{
lock( _locker)
{
if (_data == null) {
// get your data
_data = GetYourData();
}
}
}
在web应用程序中这样做是个坏主意,除非你真的知道自己在做什么
我将研究可升级锁是的,您需要再次检查数据。称为双重检查锁 理论上,在创建锁之前,第二个线程可以通过第一个空检查
if(_data == null)
{
lock( _locker)
{
if (_data == null) {
// get your data
_data = GetYourData();
}
}
}
在web应用程序中这样做是个坏主意,除非你真的知道自己在做什么
我会研究可升级的锁我从来都不需要在我的任何Web应用程序上使用任何同步机制。除非你处理的是一个多个会话正在更改的原始XML文件,否则我看不出它的必要性。就像这里的大多数人所说的那样-你的数据库会为你处理这些。更新、查询,你有什么,数据库系统(至少是您可能与ASP.NET一起使用的数据库系统)为您提供同步功能。我从来都不需要在我的任何Web应用程序上使用任何同步机制。除非您处理的是一个原始XML文件