2009-04-25 142 views
2

我试图建立一个可靠的消息服务,或者至少这是我将如何描述它。SQL Server和消息队列

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

我该如何去编写一个事务或select语句来保证不会选择与其他应用程序最近选择的行相同的行。

我不是SQL Server专家,但我期望有类似的东西。

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

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

+0

我只是在寻找关于如何做到这一点的见解或建议。 – 2009-04-26 10:37:34

回答

6

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

已经有几个问题,很多答案在这里SO,相当类同此:

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

+0

感谢您的信息,我正在寻找这样的东西,很好的答案! – 2009-04-26 10:40:27

0

将“抓取”列添加到消息表中。每个人都可以尝试抢一行一条SQL语句:

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

在此之后,如果@@ ROWCOUNT为1,行是你的。否则,别人就抓住了你之前的那一排。

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

3

这是一个相当古老的问题,可能作者的问题现在已经过去很久了,但有一点SQL技巧可以解决这个问题,并且可以对其他人有用:'readpast'提示。 使用readpast sql select将跳过查询中锁定的行。你需要的是抓住第一次解锁的行立即锁定它,其他人也不会得到它:

选择前1 *从ID

  • 与(READPAST,UPDLOCK)订单的消息,这将选择并锁定表中的第一条空闲消息,所以没有其他人能够修改它。其实我在基于SQL的消息总线中使用了相同的方法:http://http://code.google.com/p/nginn-messagebus/,它工作得非常顺利(有时比MSMQ更快)