我在尝试运行带有删除语句的sproc时收到死锁错误。发生的事情是我有一个FK约束表行正在更新,而我正在删除它所关联的表行。 约束表中正在更新的数据不再重要,任何人都无法再以任何理由访问正在更新的数据的检索,只是这样更新和删除都可以立即发生。所以,我需要将删除作为原理操作。
我需要做些什么来阻止这样的死锁?
DELETE FROM Storefront.Sidelite WHERE ID = @SideliteID
;
下面是Sidelite表和大小约束表的屏幕截图。
好的,这里没有读书。发生的唯一类型是对Size表的许多更新,而Sidelite表试图删除正在更新其大小的记录,这导致死锁。
我需要在sidelite表中删除所有操作到Size表,然后,我将删除触发器中的相关大小记录。
答案 0 :(得分:0)
在select语句中获取初始值,您可以使用(readuncommitted)或with(nolock)语句。但是这会给你脏读。请使用以下链接获取更多信息:Why use a READ UNCOMMITTED isolation level?
答案 1 :(得分:0)
1。)SET ALLOW_SNAPSHOT_ISOLATION ON
2。)SET TRANSACTION ISOLATION LEVEL SNAPSHOT
ALTER proc [Storefront].[proc_DeleteSidelite]
@SideliteID INT
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
DECLARE @SizeID INT;
BEGIN TRAN
SELECT @SizeID= sl.SizeID FROM Storefront.Sidelite sl
with(nolock) WHERE sl.ID = @SideliteID
DELETE FROM Storefront.Sidelite WHERE ID = @SideliteID;
DELETE FROM Storefront.Size WHERE ID=@SizeID;
COMMIT TRAN
END;