gpt4 book ai didi

.net - 您将如何在 .NET/SQL Server 中构建这个消息处理系统?

转载 作者:行者123 更新时间:2023-12-02 23:29:24 27 4
gpt4 key购买 nike

假设我有一个 SQL Server 数据库表,其中有 X (> 1,000,000) 条记录,需要由一些工作进程逐一处理(获取数据、执行外部操作、更新数据库中的状态) (控制台应用程序、Windows 服务、Azure 辅助角色等)。我需要保证每一行只处理一次。理想情况下,无论启动多少台机器/进程来处理消息,都可以保证排他性。我主要担心两个 SELECT 同时获取相同的行。

我知道有更好的数据存储可供排队,但我没有足够的资源来完成这个项目。我有实现此目标的想法,但我正在寻找更多。

最佳答案

我也遇到过这种情况。

向表中添加一个 InProcess 列,默认 = 0。在消费者进程中:

UPDATE tbl SET Inprocess = @myMachineID WHERE rowID = 
(SELECT MIN(rowID) WHERE InProcess = 0)

现在该机器拥有该行,您可以毫无恐惧地查询其数据。通常你的下一行将是这样的:

SELECT * FROM tbl WHERE rowID = 
(SELECT MAX(rowID) FROM tbl WHERE ProcessID = @myMachineID)

您还必须向该行添加某种Done 标志,以便您可以判断该行是否已声明但处理未完成。

编辑

UPDATE 获得独占锁(请参阅 MSDN )。我不确定子查询中的SELECT是否允许从UPDATE中分离出来;如果是这样,您必须将它们放入交易中。

@Will A 发布了一个链接,建议以此开始您的批处理将保证它:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

...但我还没有尝试过。

@Martin Smith 的链接也提出了一些很好的观点,查看 OUTPUT 子句(在 SQL 2005 中添加)。

最后一次编辑

评论中的交流非常有趣,我确实在这里学到了一些东西。这就是 SO 的用途,对吗?

只是为了颜色:当我在 2004 年使用这种方法时,我让一群网络爬虫将要搜索的 URL 转储到一个表中,然后从同一个表中提取下一个要抓取的 URL。由于爬虫试图吸引恶意软件,因此它们随时可能崩溃。

关于.net - 您将如何在 .NET/SQL Server 中构建这个消息处理系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3765068/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com