日期:2014-05-17  浏览次数:20830 次

为什么这个存储过程会产生死锁?

CREATE PROCEDURE [quest].[UserQuests_Delete]
(
@UserId INT,
@QuestId INT
)
 
AS
BEGIN
SET NOCOUNT ON
 
DELETE FROM
    quest.UserQuests
WHERE
UserId=@UserId AND
QuestId= @QuestId AND
UserQuestState=2 AND
UserQuestId<>(SELECT TOP 1 UserQuestId FROM quest.UserQuests WHERE UserId=@UserId AND QuestId= @QuestId AND UserQuestState=2 ORDER BY CreateDateUTC DESC)
 
DELETE FROM quest.UserQuests WHERE  UserQuestState=3
END
 

------解决方案--------------------
貌似不是存储过程引起的死锁。lz查查对应锁表的时候,其他进程是否有相关事务没有提交?
------解决方案--------------------
楼主
SELECT?TOP?1?UserQuestId?FROM?quest.UserQuests?

修改为:
SELECT?TOP?1?UserQuestId?FROM?quest.UserQuests?with(nolock)


你的存储过程如果并发执行,可能会相互产生阻塞,可以简单这么修改降低死锁发生率,如果还出现,那么应该就是存储过程和其他语句之间发生自锁了。