Ich rufe eine gespeicherte Prozedur auf, die entweder INSERT
oder UPDATE
ausführt, abhängig davon, ob der Prozedurschlüssel in einer Tabelle vorhanden ist.Wie Deadlock in gespeicherter SQL Server-Prozedur zu verhindern?
Bisher funktionierte das Verfahren wie erwartet. Bis unsere Benutzerbasis anfing, in der Größe zu wachsen. Heute habe ich den folgenden Fehler, die durch einen Neustart des Application Pool läuft der Dienst aufgelöst wurde:
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.
Wie können Sie Deadlock in einer SQL Server gespeicherte Prozedur verhindern?
Ich überprüfte die this link, was darauf hindeutet, dass es möglicherweise ein Problem mit einem SELECT
AND UPDATE
gleichzeitig ausgeführt haben, die den Deadlock verursacht. Aber meine Prozedur trennt die Anweisungen mit einer IF..ELSE
Bedingung, so dass beide nicht gleichzeitig ausgeführt werden konnten.
Stored Procedure:
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