如何使用 NServiceBus 避免 READPAST 锁定警告

How to avoid READPAST lock warnings using NServiceBus

场景

我编写了一个向总线发送 100 GenerateFile 命令的压力测试。 我知道这个过程成功了,因为所有 100 个文件都已按预期创建。

症状

但在服务日志中我发现了这些警告:

Warn | NServiceBus.Transport.SQLServer.ExpiredMessagesPurger | Purging expired messages from table [dbo].[TransportTable] failed after purging 0 messages.

Warn | NServiceBus.Transport.SQLServer.MessagePump | Purging expired messages from table [dbo].[TransportTable] failed with exception: System.Data.SqlClient.SqlException (0x80131904): You can only specify the READPAST lock in the READ COMMITTED or REPEATABLE READ isolation levels.

澄清:这发生在 NServiceBus 传输 table 上,而不是我自己的功能 table。

我想要的

本着尽可能保持日志干净的精神,我想避免上述警告。

所以

What is happening?

我找到了这个 link,但我仍然不清楚根本原因。

How can I avoid these warnings?

从提供的 link 来看,您似乎正在将数据插入标记为复制的 table。对于压力测试,添加到非复制的 table 并且您不会看到这些错误。

David Boike 来自 Particular Software 此处。

您是否指定了不同的事务隔离级别?您应该使用 READ COMMITTED。我们实际上有一个未解决的问题 only support read committed

READPAST 提示很重要,因为如果您有多个端点实例处理来自同一队列的消息(即 table),那么当它遇到锁定的行时,您不想挂起等待该行变得可用,因为另一个实例正在处理它。相反,您只想跳过并查看下一行。

这个警告似乎来自删除因使用 [TimeToBeReceived] 属性而过期的消息的进程。您也不希望该进程挂在锁定的行上。