Dia*_*ana 6 sql-server select locking rows
我需要一个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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6527 次 |
最近记录: |