【问题标题】:How to avoid READPAST lock warnings using NServiceBus如何使用 NServiceBus 避免 READPAST 锁定警告
【发布时间】:2017-08-17 03:41:09
【问题描述】:

场景

我编写了一个压力测试,将 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,但我仍然不清楚根本原因。

如何避免这些警告?

【问题讨论】:

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


    【解决方案1】:

    来自Particular Software 的 David Boike 在这里。

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

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

    看起来此警告来自删除因使用 [TimeToBeReceived] 属性而过期的消息的进程。您也不希望该进程被锁定的行挂起。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 它在 NServiceBus 传输表上,不是我自己的代码。
      • 哎呀!我的错!但是链接是这样说的:-)
      • 我已添加说明。
      猜你喜欢
      • 2019-02-21
      • 2016-12-25
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多