首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

为啥这个存储过程会产生死锁

2013-02-17 
为什么这个存储过程会产生死锁?CREATE PROCEDURE [quest].[UserQuests_Delete](@UserId INT,@QuestId INT)

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


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)


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

热点排行