SQL Server 和消息队列

7
我正在尝试构建可靠的消息服务,至少是这样描述它的。
我的问题是:我有一个表,我将数据插入到此表中,我至少有两个应用程序从此表中选择数据。然而,我需要一种可靠的方法,让这两个不同的应用程序在任何给定时间都不会选择相同的行。
我该如何编写事务或选择语句,以确保不会选择其他应用程序最近选择的相同行。
虽然我不是SQL Server专家,但我期望类似于以下内容。
从表中选择工作,这将使应用程序独占一些行。 然后,应用程序将处理这些行。 有些行被删除,有些行被返回到数据库中。
我的主要担忧是,如果应用程序未能完成其处理,SQL Server最终会超时并将已检出的数据返回到应用程序数据池中。

我只是在寻求关于如何做到这一点的见解或建议。 - John Leidegren
4个回答

10

7

这是一道很古老的问题,也许作者的问题现在已经解决了,但有一个小技巧可以解决它,并且可能对其他人有用:使用“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更快)。


3

2
在消息表中添加一个“已抓取”列。每个人都可以尝试使用单个SQL语句来抓取一行:
UPDATE m
SET grabbed = 1
FROM messages m
WHERE id = @myid
and grabbed = 0

接下来,如果@@ROWCOUNT为1,则该行属于您。否则,其他人在您之前抢占了该行。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接