sql - 使以下选择线程安全
问题描述
我在用于将表用作队列的存储过程中有以下 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 语句之一成为线程安全的吗?是通过做表锁还是正确的方法是什么?
解决方案
推荐阅读
- python - 将动态函数应用于相空间中的每个点(由 2D 矩阵表示)
- kubernetes - 如何在k8s中使用jq打印节点的内部IP?
- macos - 是否可以在 macOS 的 Chrome 上打开已安装 PWA 的链接?
- sql - 关闭sql应用程序后行消失
- spring - 请求被拒绝,因为 HTTP 方法“CONNECT”未包含在白名单中 [HEAD, DELETE, POST, GET, OPTIONS, PATCH, PUT]
- python - 一个处理程序可以在龙卷风中同时处理 post 和 get 的不同 URL
- android - 从两项活动中访问一项服务
- python - 带有变量的python中的awk命令
- ionic-framework - 我想在 Branch.io 中使用相同帐户和另一个帐户设置旧域名
- node.js - Node.JS 服务器、WebSockets 和 HTTP 与 HTTPS