DistributedLock 获取订单
DistributedLock Acquire Order
我获取了 DistributedLock for my .NET application that will be running on multiple servers. For those that do not know it makes use of SQL Server's application lock functionality 的 NuGet 包,以提供一种跨不同机器锁定的简单方法。因为我一直在使用它,所以它很好。但是,我想知道检查锁的顺序是否会导致在释放锁时保持顺序。
例如...假设我的应用程序正在从队列中读取,然后按顺序处理每条消息。如果每条消息都是关于家庭的,我想按顺序处理一个家庭的每条消息怎么办?遇到的第一条消息可以使用 DistributedLock 的 Acquire 来检查帐户是否空闲,如果空闲则锁定它,然后开始处理消息。然后假设队列侦听器应用程序 运行ning 在另一台服务器上,它从同一家庭的队列中读取另一条消息。在这种情况下,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 可能获得下一个锁?秩序会维持吗?
我提出这个答案时要注意,我是 DBA 而不是应用程序开发人员(我对 C# 的了解足够危险)。
查看您链接到的两件事,我不认为请求有任何顺序。 sp_getapplock 使用与 SQL 相同的锁定功能来锁定行和表等内容。只是您要定义虚拟资源的名称。因此,当任务通过 sp_getapplock 请求锁定时,会发生以下情况(在高级别)
- 任务进入可运行队列
- 任务到达队列顶部
- 如果锁当前不属于另一个进程,你得到它就完成了
- 如果锁当前被另一个进程拥有,你进入等待状态
- 释放锁后,您的进程会收到信号 "wake up",此时它会进入可运行队列(即返回第一步)
问题是每个调度程序都有自己的可运行队列(即每个 SQL 实例不只有一个可运行队列),因此哪个进程先到达那里是不确定的。
如果您正在寻找按顺序处理,您可能想看看 Service Broker 或其他某种具有主题和按顺序交付的排队技术。
我获取了 DistributedLock for my .NET application that will be running on multiple servers. For those that do not know it makes use of SQL Server's application lock functionality 的 NuGet 包,以提供一种跨不同机器锁定的简单方法。因为我一直在使用它,所以它很好。但是,我想知道检查锁的顺序是否会导致在释放锁时保持顺序。
例如...假设我的应用程序正在从队列中读取,然后按顺序处理每条消息。如果每条消息都是关于家庭的,我想按顺序处理一个家庭的每条消息怎么办?遇到的第一条消息可以使用 DistributedLock 的 Acquire 来检查帐户是否空闲,如果空闲则锁定它,然后开始处理消息。然后假设队列侦听器应用程序 运行ning 在另一台服务器上,它从同一家庭的队列中读取另一条消息。在这种情况下,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 可能获得下一个锁?秩序会维持吗?
我提出这个答案时要注意,我是 DBA 而不是应用程序开发人员(我对 C# 的了解足够危险)。
查看您链接到的两件事,我不认为请求有任何顺序。 sp_getapplock 使用与 SQL 相同的锁定功能来锁定行和表等内容。只是您要定义虚拟资源的名称。因此,当任务通过 sp_getapplock 请求锁定时,会发生以下情况(在高级别)
- 任务进入可运行队列
- 任务到达队列顶部
- 如果锁当前不属于另一个进程,你得到它就完成了
- 如果锁当前被另一个进程拥有,你进入等待状态
- 释放锁后,您的进程会收到信号 "wake up",此时它会进入可运行队列(即返回第一步)
问题是每个调度程序都有自己的可运行队列(即每个 SQL 实例不只有一个可运行队列),因此哪个进程先到达那里是不确定的。
如果您正在寻找按顺序处理,您可能想看看 Service Broker 或其他某种具有主题和按顺序交付的排队技术。