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

时间:2017-03-24 09:14:08

标签: c# .net sql-server nservicebus esb

方案

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

症状

在服务日志中,我发现了以下警告:

  

警告| NServiceBus.Transport.SQLServer.ExpiredMessagesPurger |清洗   来自表[dbo]的过期消息。[TransportTable]在清除0后失败   消息。

  

警告| NServiceBus.Transport.SQLServer.MessagePump |清洗   来自表[dbo]的过期消息。[TransportTable]失败,异常:   System.Data.SqlClient.SqlException(0x80131904):您只能指定   READ COMMITTED或REPEATABLE READ隔离中的READPAST锁   水平。

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

我想要什么

本着尽可能保持原木清洁的精神,我想避免上述警告。

因此

  

发生了什么事?

我发现了link,但根本原因对我来说仍然不明确。

  

如何避免这些警告?

2 个答案:

答案 0 :(得分:4)

来自Particular Software的David Boike。

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

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

看起来这个警告来自删除因使用[TimeToBeReceived]属性而过期的邮件的过程。您不希望该进程挂起锁定的行。

答案 1 :(得分:0)

从提供的链接中,您似乎将数据插入到标记为要复制的表中。对于压力测试添加到非复制表,您将看不到这些错误。