NServiceBus阻止两个使用者处理消息?
NServiceBus文档列出了SQL传输的一个好处: 队列支持竞争消费者(同一个队列的多个实例) 端点从同一队列馈出),因此不需要 分销商,以扩大加工范围 如果多个使用者已订阅同一队列,NServiceBus会阻止多个使用者处理消息吗NServiceBus阻止两个使用者处理消息?,nservicebus,nservicebus-distributor,Nservicebus,Nservicebus Distributor,NServiceBus文档列出了SQL传输的一个好处: 队列支持竞争消费者(同一个队列的多个实例) 端点从同一队列馈出),因此不需要 分销商,以扩大加工范围 如果多个使用者已订阅同一队列,NServiceBus会阻止多个使用者处理消息吗 在处理消息之前,NServiceBus是否锁定整个表?或者消息是否标记为“正在处理”?SQL传输使用非常特定的锁定提示来锁定行,并使其他竞争线程忽略当前锁定的任何行 从(我写这篇文章时的当前版本)开始,使用的SQL,但我重新格式化了,是: WITH messa
在处理消息之前,NServiceBus是否锁定整个表?或者消息是否标记为“正在处理”?SQL传输使用非常特定的锁定提示来锁定行,并使其他竞争线程忽略当前锁定的任何行 从(我写这篇文章时的当前版本)开始,使用的SQL,但我重新格式化了,是:
WITH message AS
(
SELECT TOP(1) *
FROM [{Schema}].[{Queue}] WITH (UPDLOCK, READPAST, ROWLOCK)
ORDER BY [RowVersion] ASC
)
DELETE FROM message
OUTPUT deleted.Id, deleted.CorrelationId, deleted.ReplyToAddress,
deleted.Recoverable, deleted.Expires, deleted.Headers, deleted.Body;
它使用将源数据限制为要返回的一行,然后使用以下锁定提示:
-锁定数据以更新数据UPDLOCK
-忽略锁定的行并获取下一个解锁的行readpass
-强制行级锁,不要升级到页面锁或表锁ROWLOCK
通过将整个事件作为delete执行,然后输出将要删除的数据,我们可以读取数据,如果事务提交,则删除该行。否则,如果事务回滚,则锁将被释放,该行将等待下一个竞争消费者拾取。SQL传输使用非常特定的锁提示来锁定一行,并使其他竞争线程忽略当前锁定的任何行 从(我写这篇文章时的当前版本)开始,使用的SQL,但我重新格式化了,是:
WITH message AS
(
SELECT TOP(1) *
FROM [{Schema}].[{Queue}] WITH (UPDLOCK, READPAST, ROWLOCK)
ORDER BY [RowVersion] ASC
)
DELETE FROM message
OUTPUT deleted.Id, deleted.CorrelationId, deleted.ReplyToAddress,
deleted.Recoverable, deleted.Expires, deleted.Headers, deleted.Body;
它使用将源数据限制为要返回的一行,然后使用以下锁定提示:
-锁定数据以更新数据UPDLOCK
-忽略锁定的行并获取下一个解锁的行readpass
-强制行级锁,不要升级到页面锁或表锁ROWLOCK