【发布时间】:2016-06-09 14:50:37
【问题描述】:
我为将在多个服务器上运行的 .NET 应用程序获取了 DistributedLock 的 NuGet 包。对于那些不知道它使用SQL Server's application lock functionality 来提供跨不同机器锁定的简单方法的人。我一直在使用它,因为它很好。但是,我想知道检查锁的顺序是否会导致释放锁时保持顺序。
例如...假设我的应用程序正在从队列中读取数据,然后按顺序处理每条消息。如果每条消息都是关于家庭的,我想按顺序处理家庭的每条消息怎么办。遇到的第一条消息可以使用 DistributedLock 的 Acquire 检查帐户是否空闲,如果空闲则锁定它,然后开始处理该消息。然后假设队列侦听器应用程序正在另一台服务器上运行,它从同一家庭的队列中读取另一条消息。在这种情况下,Acquire 将等到家庭的锁空闲,然后重新锁定并处理消息。
var myLock = new SystemDistributedLock("UniqueHouseholdIdentifier");
using (myLock.Acquire())
{
// message processed here in the lock
}
但是如果有第三台机器运行相同的应用程序并且遇到具有相同家庭标识符的消息怎么办?
所以机器#1 获取了家庭 ID A01 的第一条消息,将其锁定并开始处理它。机器#2 在队列中为 A01 抓取第二条消息并等待。机器#3 从队列中为 A01 抓取第三条消息并等待。
在上述情况下,当机器#1 完成处理它的 A01 消息并释放锁时,机器#2,它为 A01 拾取第二条消息,在机器 #3 之前运行?或者它实际上是随机的,并且机器#2 或#3 可能会获得下一个锁?秩序会维持吗?
【问题讨论】:
-
如果每条消息都有自己的锁,为什么会有任何订购要求?事实上,在您的示例中,为什么任何收购方都会阻止?
标签: .net sql-server distributed-lock