如何克服僵局

时间:2012-09-05 19:41:58

标签: sql deadlock

我在尝试运行带有删除语句的sproc时收到死锁错误。发生的事情是我有一个FK约束表行正在更新,而我正在删除它所关联的表行。 约束表中正在更新的数据不再重要,任何人都无法再以任何理由访问正在更新的数据的检索,只是这样更新和删除都可以立即发生。所以,我需要将删除作为原理操作。

我需要做些什么来阻止这样的死锁?

DELETE FROM Storefront.Sidelite WHERE ID = @SideliteID;

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

Tables in question

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

我需要在sidelite表中删除所有操作到Size表,然后,我将删除触发器中的相关大小记录。

2 个答案:

答案 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;