SQL DeadLock示例

时间:2017-06-14 16:06:18

标签: sql sql-server stored-procedures

可以解释一下这是否是SQL存储过程死锁的一个很好的例子?

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

例如,如果检查WHERE子句中的SELECT语句,我实际上是在同一用户的同一个表中请求数据。

我应该创建一个DECLARE并将数据接受到var外部然后应用where子句吗?

这样写一个查询是不好的做法吗?

1 个答案:

答案 0 :(得分:0)

如果您希望分析整个DeadLock方案并能够重现它。

我建议您使用SQL Server Profiler型号运行TSQL_Locks

如果发生死锁,DeadLock graph列将填充一个分析问题的好方法。