0

尝试运行带有删除语句的存储过程时,我收到死锁错误。发生的事情是我有一个 FK 约束表行,该行与我要删除的与之相关的表行同时更新。约束表中正在更新的数据不再重要,任何人都将不再出于任何原因访问正在更新的数据的检索,碰巧这种更新和删除都可以同时发生。所以,我需要以删除为主要操作。

我需要做什么来阻止这样的僵局?

DELETE FROM Storefront.Sidelite WHERE ID = @SideliteID;

下面是 Sidelite 表和 Size 约束表的屏幕截图。

有问题的表

好的,这里没有读取。唯一发生的事情是对 Size 表的许多更新,而 Sidelite 表试图删除它的大小正在更新的记录,这会导致死锁。

我需要停止对 Size 表的所有操作,同时在 sidelite 表中进行删除,然后,我将在触发器中删除相关的大小记录。

4

2 回答 2

0

在获得初始值的 select 语句中,您可以使用 with(readuncommitted) 或 with(nolock) 语句。然而,这会给你带来脏读。请使用以下链接获取更多信息:为什么使用 READ UNCOMMITTED 隔离级别?

于 2012-09-05T19:47:40.287 回答
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;
于 2012-09-06T17:40:19.220 回答