作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我不需要 100% 防止死锁,但我能做的任何事情来减少它们都会很好。
我有两张 table Source
和 Dest
.源中有许多唯一值,我需要从 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
时,这偶尔会引发死锁排。我该如何预防/减少这种情况?
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/
我是一名优秀的程序员,十分优秀!