首页 > 解决方案 > 使以下选择线程安全

问题描述

我在用于将表用作队列的存储过程中有以下 SQL:

UPDATE [dbo].[AppRegistrations]
SET LastUsed = CURRENT_TIMESTAMP
OUTPUT INSERTED.*
WHERE Id = (SELECT TOP (1) Id 
            FROM [dbo].[AppRegistrations] 
            ORDER BY LastUsed)

我在这里被告知上面是线程安全的。

我还尝试了以下操作:

declare @id int
declare @name as nvarchar(512)
declare @applicationId as nvarchar(512)
declare @applicationKey as nvarchar(512)

select top 1 
    @id = id,
    @name = name,
    @applicationId = [ApplicationId],
    @applicationKey = [ApplicationKey] 
from 
    [dbo].[AppRegistrations] with (HOLDLOCK, ROWLOCK) 
order by 
    LastUsed 

Update [dbo].[AppRegistrations] 
set LastUsed = getdate() 
where id = @id

select 
    @id as Id, @name as Name, 
    @applicationId as ApplicationId, @applicationKey as ApplicationKey

我们有大约 50 个作业同时运行。该表有 50 行,目标是没有作业使用相同的应用程序注册。有什么建议可以使两个 SQL 语句之一成为线程安全的吗?是通过做表锁还是正确的方法是什么?

标签: sqlsql-server

解决方案


推荐阅读