加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 在“select top n”查询中返回未锁定的行

发布时间:2021-03-06 19:47:10 所属栏目:编程 来源:网络整理
导读:我必要一个MsSql数据库表和其它8个(沟通的)历程并行会见统一个表 – 举办选择前n个,处理赏罚这n行,并更新这些行的列.题目是我只必要选择并处理赏罚每一行.这意味着假如一个历程达到数据库并选择前n行,当第二个历程到来时,它应该找到锁定的行并选择从n到2 * n行的行,依

我必要一个MsSql数据库表和其它8个(沟通的)历程并行会见统一个表 – 举办选择前n个,处理赏罚这n行,并更新这些行的列.题目是我只必要选择并处理赏罚每一行.这意味着假如一个历程达到数据库并选择前n行,当第二个历程到来时,它应该找到锁定的行并选择从n到2 * n行的行,依此类推……

当你选择它们时,是否有也许锁定某些行,当有人哀求锁定的前n行返回下一行,而不是守候锁定的行?看起来像是远射,但……

我想的另一件事 – 也许不那么优雅,但听起来简朴而安详,就是在数据库中有一个计数器,用于在该表长举办选择的实例.第一个实例将递增计数器并选择前n个,下一个将递增计数器并从n *(i-1)到n * i选择行,依此类推……

这听起来像是一个好的设法吗?你有什么更好的提议吗?任何设法都很是感激!

感谢你的时刻.

办理要领

这是一个示例 I blogged about a while ago:

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

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读