gpt4 book ai didi

tsql - 如何防止在此 SQL 中发生死锁

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

首先,我不需要 100% 防止死锁,但我能做的任何事情来减少它们都会很好。

我有两张 table SourceDest .源中有许多唯一值,我需要从 Source 请求一个新值并在此过程中将其移至 Dest .

我有以下sql:

begin tran
declare @value
select top 1 @value = [value] from [source]
delete from [Source] where [value]=@value
insert into [Dest] ([Value]) values (@value)
select @value
commit tran

当多个用户获得相同的 value 时,这偶尔会引发死锁排。我该如何预防/减少这种情况?

我正在使用 SQL Server 2008

顺便说一句, Source 中还有其他列和 Dest我正在阅读/写作。为了简洁起见,这是一个简化。

谢谢

最佳答案

您可以使用 OUTPUT 来避免这种竞争条件。子句您的 DELETE 命令,因为它将从源中删除值并在单个原子操作中返回它。我制作了以下脚本来演示这个概念:

-- dummy data
CREATE TABLE #source (mycolumn INT);
CREATE TABLE #destination (mycolumn INT);

INSERT #source VALUES (1);
INSERT #source VALUES (2);
INSERT #source VALUES (3);
GO

-- stored procedure to demonstrate concept
CREATE PROCEDURE move
AS BEGIN
BEGIN TRANSACTION;

DECLARE @tmp TABLE (mycolumn INT);
DELETE TOP(1) #source OUTPUT DELETED.mycolumn INTO @tmp(mycolumn);

INSERT #destination (mycolumn) OUTPUT INSERTED.mycolumn
SELECT mycolumn
FROM @tmp;

COMMIT;
END
GO

-- testing
EXEC move;
GO -- remove from 1 from #source, insert 1 into #destination, returns 1

EXEC move;
GO -- remove from 2 from #source, insert 2 into #destination, returns 2

EXEC move;
GO -- remove from 3 from #source, insert 3 into #destination, returns 3

关于tsql - 如何防止在此 SQL 中发生死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10416933/

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