可以解释一下这是否是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子句吗?
这样写一个查询是不好的做法吗?
答案 0 :(得分:0)
如果您希望分析整个DeadLock方案并能够重现它。
我建议您使用SQL Server Profiler
型号运行TSQL_Locks
。
如果发生死锁,DeadLock graph
列将填充一个分析问题的好方法。