并行处理数据库队列

Bir*_*iri 4 c# sql-server-2005 distributed-system

有一个小系统,其中数据库表作为MSSQL 2005上的队列.一些应用程序正在写入此表,一个应用程序正在以FIFO方式读取和处理.

我必须使它更先进,以便能够创建一个分布式系统,其中可以运行多个处理应用程序.结果应该是2-10处理应用程序应该能够运行并且它们在工作期间不应该相互干扰.

我的想法是扩展队列表,其中一行显示进程已在处理它.处理应用程序将首先使用idetifyer更新表,然后请求更新的记录.

所以像这样:

start transaction
update top(10) queue set processing = 'myid' where processing is null
select * from processing where processing = 'myid'
end transaction
Run Code Online (Sandbox Code Playgroud)

在处理之后,它将表的处理列设置为其他内容,例如"完成"或其他任何内容.

关于这种方法,我有三个问题.

第一:这可以用这种形式吗?

第二:如果它有效,它是否有效?你有什么其他想法来创建这样的发行版吗?

第三:在MSSQL中,锁定是基于行的,但是在锁定了一定数量的行之后,锁定会扩展到整个表.因此,在第一个应用程序未释放事务之前,第二个应用程序无法访问它.选择有多大(顶部x)以便不锁定整个表,只创建行锁?

Gre*_*ech 6

这样可行,但您可能会发现在多个进程尝试读取/更新相同数据时会遇到阻塞或死锁.我编写了一个程序来为我们的一个系统做这个,它使用一些有趣的锁定语义来确保这种类型的东西运行时没有阻塞或死锁,这里描述.