0

delete ステートメントを含む sproc を実行しようとすると、デッドロック エラーが発生します。何が起こっているのかというと、関連するテーブル行を削除すると同時に更新される FK 制約テーブル行があるということです。制約テーブルで更新されているデータはもはや重要ではなく、更新されているそのデータの取得は、何らかの理由で誰もアクセスできなくなります。たまたま、この更新と削除が一度にすべて発生する可能性があります。したがって、原則として削除する必要があります。

このようなデッドロックを止めるにはどうすればよいですか?

DELETE FROM Storefront.Sidelite WHERE ID = @SideliteID;

以下は、サイドライト テーブルとサイズ制約テーブルのスクリーン ショットです。

問題のテーブル

OK、ここでは読み取りは行われていません。Sidelite テーブルが、サイズが更新されているというレコードを削除しようとしている間に、Size テーブルに多くの更新が行われ、これがデッドロックを引き起こしている唯一のタイプのことです。

サイドライト テーブルで削除が行われている間、サイズ テーブルに対するすべての操作を停止する必要があります。その後、トリガーで関連するサイズ レコードを削除します。

4

2 に答える 2

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 に答える
0

with(readuncommitted)またはwith(nolock)ステートメントを使用できる初期値を取得しているselectステートメントで。ただし、これによりダーティリードが発生します。詳細については、次のリンクをご利用ください。なぜ READ UNCOMMITTED 分離レベルを使用するのですか?

于 2012-09-05T19:47:40.287 に答える