15

lock语句确保一个线程不进入代码的临界区,而另一个线程在临界区。但是,如果工作负载分布在一组服务器(例如几个 IIS 服务器 + 一个负载平衡器)上,它就不会起作用。

.NET 是否支持这种情况?
是否有任何类可用于控制多台机器上运行的线程对关键代码部分的执行?

如果没有,是否有处理此类问题的标准方法?

这个问题的灵感来自于从此处开始但不限于 SharePoint 或 ASP.NET 的讨论。

4

5 回答 5

6

如果您有权访问集中式 SQL Server 实例,则可以将其用作分布式锁协调器并使用sp_getapplocksp_releaseapplock存储过程管理应用程序锁。

SQL Server 2005 中的应用程序锁(或互斥锁)

于 2011-11-18T22:10:57.420 回答
4

lock语句仅对在进程内共享资源有用。

MutexEventWaitHandle类在使用以"Global\".

除此之外,您还必须在 .NET 之外实现一些东西,例如在共享 SQL 数据库上使用sp_getapplock/ 。sp_releaseapplock

于 2011-11-18T21:43:06.767 回答
1

由于标准场景中的机器网络不在共享内存上运行,因此它们没有可用于同步的单个变量的全局视图。因此,您必须通过消息传递来实现锁定。

如果你想锁定共享资源,你可以让一个中央“主人”控制对该资源的访问。

编辑:如果您需要的不是共享资源(例如屏障),您可以使用例如 MSMQ 在机器之间传递消息。可能套接字级别太低。

于 2011-11-18T21:38:06.347 回答
1

目前还没有办法用 ASP.NET 实现机器间线程控制。但这可以通过更高级别的应用程序架构来实现。基本上,您必须使用自己的业务逻辑自己实现它。

从架构上讲,您应该在解决方案中引入 ILockable 接口,并让类在某些情况下需要停止操作才能实现它。然后使用一组网关来相互管理这些锁。

于 2011-11-18T21:39:21.120 回答
1

.Net 中没有任何东西可以原生支持跨机器锁定。

标准方法是将此类事情的责任转移到一个地方,可能是一个 Web 服务(不是负载平衡的!),因此仍然可以从多个位置调用它。或者,定义一个可供所有人访问的单一资源(例如数据库)并将其用作要获取的单一资源(例如,在锁表中写入键,如果键存在,则在删除行之前无法获取锁)

于 2011-11-18T21:39:59.540 回答