有一个小型系统,其中一个数据库表作为 MSSQL 2005 上的队列。几个应用程序正在写入该表,一个应用程序正在以 FIFO 方式读取和处理。
我必须让它更高级一点,才能创建一个分布式系统,在其中可以运行多个处理应用程序。结果应该是2-10个处理应用程序应该能够运行并且它们在工作期间不应相互干扰。
我的想法是用一行显示一个进程已经在处理它来扩展队列表。处理应用程序将首先使用它的标识符更新表,然后请求更新的记录。
所以是这样的:
start transaction
update top(10) queue set processing = 'myid' where processing is null
select * from processing where processing = 'myid'
end transaction
处理后,它将表的处理列设置为其他内容,例如“完成”或其他内容。
我对这种方法有三个问题。
第一:这可以以这种形式工作吗?
第二:如果有效,是否有效?您还有其他想法来创建这样的发行版吗?
第三:在 MSSQL 中,锁定是基于行的,但是在锁定一定数量的行之后,锁定会扩展到整个表。所以第二个应用程序不能访问它,直到第一个应用程序不释放事务。为了不锁定整个表,只创建行锁,选择(top x)可以有多大?