gpt4 book ai didi

sql-server - 使用 TOP 子句在同一事务中选择和删除

转载 作者:行者123 更新时间:2023-12-04 01:45:52 25 4
gpt4 key购买 nike

我有一个表格,其中的数据不断快速添加。

我需要从这个表中获取记录并立即删除它们,这样我就不能第二次处理同一条记录。并且由于数据以更快的速度添加,我需要使用 TOP 子句,因此当时只有少量记录进入业务逻辑进行处理。

我正在使用下面的查询来

BEGIN TRAN readrowdata
SELECT
top 5 [RawDataId],
[RawData]
FROM
[TABLE] with(HOLDLOCK)

WITH q AS
(
SELECT
top 5 [RawDataId],
[RawData]
FROM
[TABLE] with(HOLDLOCK)
)

DELETE from q
COMMIT TRANSACTION readrowdata

我在这里使用了 HOLDLOCK,所以当我执行 SELECT 和 DELETE 操作时,新数据不能插入到表中。我使用它是因为假设如果现在表中只有 3 条记录,那么 SELECT 语句将获得 3 条记录,同时插入新记录,DELETE 语句将删除 4 条记录。所以我将在这里丢失 1 个数据。

查询在性能方面是否正常?如果我可以改进它,请向我提供您的建议。

谢谢

最佳答案

就我个人而言,我会使用不同的方法。一个锁定较少,但也有额外的信息表明某些记录当前正在处理......

DECLARE @rowsBeingProcessed TABLE (
id INT
);

WITH rows AS (
SELECT top 5 [RawDataId] FROM yourTable WHERE processing_start IS NULL
)
UPDATE rows SET processing_start = getDate() WHERE processing_start IS NULL
OUTPUT INSERTED.RowDataID INTO @rowsBeingProcessed;

-- Business Logic Here

DELETE yourTable WHERE RowDataID IN (SELECT id FROM @rowsBeingProcessed);

然后您还可以添加检查,例如“如果记录已被‘处理’超过 10 分钟,则假定业务逻辑失败”,等等。

关于sql-server - 使用 TOP 子句在同一事务中选择和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9409966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com