2017-06-14 4 views
0

Kann man erklären, ob dies ein gutes Beispiel für eine tote Sperre für SQL Stored Procedure ist?SQL DeadLock Beispiel

BEGIN TRANSACTION MergeAccount 

MERGE INTO Name AS TARGET 
USING (
    SELECT @accountId, @playerName, @lastSeenDateTime 
) AS SOURCE (
    [AccountId], [Name], [LastSeenDateTime] 
) 
ON TARGET.[AccountId] = SOURCE.[AccountId] 
AND 
(
    SELECT TOP 1 [Name] 
    FROM [Name] 
    WHERE [AccountId] = @AccountId 
    ORDER BY [LastSeenDateTime] DESC 
) = SOURCE.[Name] 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (
     [AccountId], [Name], [LastSeenDateTime] 
    ) VALUES (
     [AccountId], [Name], [LastSeenDateTime] 
    ) 
WHEN MATCHED AND SOURCE.LastSeenDateTime > TARGET.LastSeenDateTime THEN 
    UPDATE 
    SET TARGET.LastSeenDateTime = SOURCE.LastSeenDateTime 
; 

COMMIT TRANSACTION MergeAccount 

Zum Beispiel, wenn Sie die SELECT-Anweisung in der WHERE-Klausel überprüfen, bitte ich eigentlich für Daten in der gleichen Tabelle des gleichen Benutzers.

Sollte ich eine DECLARE erstellen und die Daten in eine Variable außerhalb übernehmen, dann wenden Sie die WHERE-Klausel an?

Ist es eine schlechte Übung, eine Abfrage als solche zu schreiben?

+0

Deadlocks passieren zwischen * verschiedenen * Sitzungen, nicht in einer Anweisung einer Sitzung. (Mit Ausnahme der seltenen, seltenen Intra-Statement Deadlocks mit Parallelität; diese werden als Bugs betrachtet. "MERGE" hat tatsächlich ein paar solcher Bugs gesehen.) Haben Sie tatsächlich Deadlocks, die Sie zu lösen versuchen, oder ist das ein hypothetisches Problem? –

+0

Hier ist ein ähnliches Szenario mit einer guten Erklärung: https://dba.stackexchange.com/questions/23467/merge-statement-deadlocking-self. Per @ JeroenMostert obwohl; Dies erfordert eine konkurrierende zweite Sitzung. – JohnLBevan

+0

@JeroenMostert Dies ist ein gültiges Anliegen, da ich Probleme habe. Das Programm meldet dies in dieser Stored Procedure. Obwohl es sehr einfach ist, gibt es Konkurrenz mit anderen Sitzungen (wir laufen viele Bots der gleichen Anwendung). Nicht einmal sicher, wie man es vereinfacht, da es schon ziemlich einfach ist. –

Antwort

0

Wenn Sie das gesamte DeadLock-Szenario analysieren und reproduzieren möchten.

Ich empfehle Ihnen, SQL Server Profiler mit dem TSQL_Locks Modell zu betreiben.

Wenn ein Deadlock auftritt, wird die DeadLock graph Spalte mit einer netten Möglichkeit gefüllt, um Ihr Problem zu analysieren.