我需要有一个 MsSql 数据库表和另外 8 个(相同的)进程并行访问同一个表 - 选择前 n 行,处理这 n 行,并更新这些行的列。问题是我只需要选择并处理每一行一次。这意味着,如果一个进程访问数据库并选择了前 n 行,那么当第二个进程到来时,它应该会发现这些行已锁定,并选择 n 到 2*n 行中的行,依此类推...
当您选择某些行时,以及当有人请求锁定的前 n 行以返回下一行时,是否可以对某些行进行锁定,而不是等待锁定的行?看起来似乎是一个很遥远的事情,但是……
我在想的另一件事 - 也许不是那么优雅,但听起来简单且安全,是在数据库中为在该表上进行选择的实例设置一个计数器。第一个实例将增加计数器并选择前 n 个,下一个实例将增加计数器并选择从 n*(i-1) 到 n*i 的行,依此类推...
这听起来是个好主意吗?您有更好的建议吗?任何想法都受到高度赞赏!
谢谢你的时间。
这是一个示例我不久前写过博客:
READPAST 提示可确保多个进程在轮询要处理的记录时不会互相阻塞。另外,在这个例子中,我有一个位字段来物理“锁定”记录 - 如果需要的话可以是日期时间。
DECLARE @NextId INTEGER
BEGIN TRANSACTION
-- Find next available item available
SELECT TOP 1 @NextId = ID
FROM QueueTable WITH (UPDLOCK, READPAST)
WHERE IsBeingProcessed = 0
ORDER BY ID ASC
-- If found, flag it to prevent being picked up again
IF (@NextId IS NOT NULL)
BEGIN
UPDATE QueueTable
SET IsBeingProcessed = 1
WHERE ID = @NextId
END
COMMIT TRANSACTION
-- Now return the queue item, if we have one
IF (@NextId IS NOT NULL)
SELECT * FROM QueueTable WHERE ID = @NextId
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)