テーブルにあるプロシージャキーに依存するINSERT
またはUPDATE
のいずれかを実行するストアドプロシージャを呼び出しています。どのようにSQL Serverストアドプロシージャのデッドロックを防ぐには?
これまでのところ、手順は期待通りに機能していました。ユーザーベースの規模が拡大し始めるまで。今日、私はサービスを実行しているアプリケーションプールを再起動することで解決した、次のエラーを得た:
InsertDDM_UserDashboard error: RequestError: Transaction (Process ID 64) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
どのようにSQL Serverのストアドプロシージャでのデッドロックを防ぐことができますか?
私はSELECT
と同時にデッドロックの原因となっている問題が発生している可能性があることを示唆しているthis linkを確認しました。しかし、私の手続きでは、IF..ELSE
という条件でステートメントを分けるので、両方を同時に実行することはできませんでした。
ストアドプロシージャ:
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[InsertDDM_UserDashboard]
@p_email VARCHAR(255),
@p_dashboardPreferences VARCHAR(4000),
@p_userDefaultDashboard VARCHAR(500)
AS
IF (NOT EXISTS(SELECT * FROM [dbo].[DDM_UserProfile] WHERE Email = @p_email))
BEGIN
INSERT INTO [dbo].[DDM_UserProfile]
([Email]
,[DashboardPreferences]
,DefaultDashboard
)
VALUES
(@p_email
,@p_dashboardPreferences
,@p_userDefaultDashboard
)
END ELSE BEGIN
UPDATE [dbo].[DDM_UserProfile]
SET [DashboardPreferences][email protected]_dashboardPreferences
WHERE [Email][email protected]_email
UPDATE [dbo].[DDM_UserProfile]
SET [email protected]_userDefaultDashboard
WHERE [Email][email protected]_email
END