【发布时间】:2017-05-22 16:25:39
【问题描述】:
我正在调用一个存储过程,该过程执行INSERT 或UPDATE,具体取决于表中存在的过程键。
到目前为止,程序按预期工作。直到我们的用户群开始扩大。今天我收到以下错误,通过重新启动运行该服务的应用程序池解决了这个错误:
InsertDDM_UserDashboard 错误:RequestError:事务(进程 ID 64)在锁资源上与另一个进程死锁,并已被选为死锁牺牲品。重新运行事务。
如何防止 SQL Server 存储过程中的死锁?
我查看了this link,这表明SELECT 和UPDATE 同时运行可能导致死锁。但我的程序用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]=@p_dashboardPreferences
WHERE [Email]=@p_email
UPDATE [dbo].[DDM_UserProfile]
SET DefaultDashboard=@p_userDefaultDashboard
WHERE [Email]=@p_email
END
【问题讨论】:
标签: sql-server stored-procedures transactions deadlock