SQL Server和消息队列

Joh*_*ren 2 c# sql sql-server

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

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

我将如何编写一个事务或select语句,保证不选择与其他应用程序最近选择的行相同的行.

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

从表中选择工作,这将为应用程序提供对某些行的独占访问权限.然后,应用程序将处理这些行.某些行被删除,一些行返回到数据库.

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

nig*_*tch 7

这是一个相当老的问题,也许作者的问题现在已经消失了,但是有一个 SQL 的小技巧可以解决它并且对其他人可能有用:“readpast”提示。使用 readpast sql select 将跳过查询中锁定的行。您想要的是获取第一个未锁定的行并立即锁定它,这样其他人就不会得到它:

select top 1 * 
from messages with(readpast, updlock) 
order by id
Run Code Online (Sandbox Code Playgroud)

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


Mit*_*eat 6

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

在这里有几个问题和许多答案,与此类似:

如何在运行进程时锁定某些SQL行?

针对消息传递系统中的表的队列

在mysql中实现消息队列表的最佳方法是什么

从SQL Server向MSMQ发送消息