能否解释一下,这是否是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语句,我实际上是在请求同一用户的同一个表中的数据。
我是否应该创建一个声明,并在外部将数据接受到var中,然后应用where子句?
这样编写查询是不是不好的做法?
发布于 2017-06-19 19:58:54
如果您希望分析整个DeadLock场景并能够重现它。
我建议您使用TSQL_Locks模型运行SQL Server Profiler。
如果发生死锁,DeadLock graph列将填充一个很好的方法来分析您的问题。
https://stackoverflow.com/questions/44549712
复制相似问题