如何使用 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] 属性而过期的消息的进程。您也不希望该进程挂在锁定的行上。
场景
我编写了一个向总线发送 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] 属性而过期的消息的进程。您也不希望该进程挂在锁定的行上。