【问题标题】:SQL Server and message queuesSQL Server 和消息队列
【发布时间】:2010-10-21 18:34:14
【问题描述】:

我正在尝试构建一个可靠的消息服务,或者至少我会这样描述它。

这是我的问题:我有一个表,我将数据插入到这个表中,我至少有两个应用程序从这个表中选择数据。但是,我需要一种可靠的方法让两个不同的应用程序在任何给定时间都不会选择相同的行。

我将如何编写保证不会选择其他应用程序最近选择的相同行的事务或选择语句。

我不是 SQL Server 专家,但我希望得到类似的结果。

从表中选择工作,这将使应用程序独占访问某些行。然后应用程序将处理这些行。一些行被删除,一些行被返回到数据库。

我主要担心的是,如果应用程序无法完成其处理,SQL Server 最终会超时并将签出的数据返回到应用程序数据池。

【问题讨论】:

  • 我只是在寻找有关如何执行此操作的见解或建议。

标签: c# sql sql-server


【解决方案1】:

为每条记录添加一个“正在处理”标志,该标志以“原子”方式设置。

这里有几个问题和很多答案,和这个很相似:

How do I lock certain SQL rows while running a process on them?

Queues against Tables in messaging systems

What’s the best way of implementing a messaging queue table in mysql

Posting Message to MSMQ from SQL Server

【讨论】:

    【解决方案2】:

    看看SQL Server Service Broker,就是针对这类问题设计的。

    如果需要队列,请使用队列。

    【讨论】:

      【解决方案3】:

      在消息表中添加一个“已抓取”列。每个人都可以尝试用一条 SQL 语句来抓取一行:

      UPDATE m
      SET grabbed = 1
      FROM messages m
      WHERE id = @myid
      and grabbed = 0
      

      在此之后,如果@@ROWCOUNT 为 1,则该行是你的。否则,其他人抢了你之前的那一排。

      SQL Server Broker 或 MSMQ 或 MQSeries 引入了巨大的复杂性和维护开销。在您开始使用之前,请确保收到您资料的运营人员同意。

      【讨论】:

        【解决方案4】:

        这是一个相当古老的问题,可能作者的问题早已不复存在,但有一个小 SQL 技巧可以解决它并且对其他人有用:'readpast' 提示。 使用 readpast sql select 将跳过查询中的锁定行。你想要的是抓住第一个解锁的行并立即锁定它,这样其他人就不会得到它:

        select top 1 * 
        from messages with(readpast, updlock) 
        order by id
        

        这将选择并锁定表中的第一条空闲消息,因此其他人将无法修改它。实际上我在基于 SQL 的消息总线中使用了相同的方法:http://http://code.google.com/p/nginn-messagebus/,它工作得非常顺利(有时比 MSMQ 快)

        【讨论】:

          猜你喜欢
          • 2013-01-16
          • 1970-01-01
          • 2013-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-21
          • 1970-01-01
          相关资源
          最近更新 更多