SQL死锁在存储过程中插入更新语句

时间:2012-05-24 12:11:16

标签: database-deadlocks

我有一个非常基本的名为Titles的表,如下所示,

TitleID - auto identity and PK
UserID - reference key to User table
Title - varchar
IsPrimary - bit

只有一个索引是TitleID上的PK Clustered Index

现在我通过ReadCommitted事务中的存储过程在此表中插入记录,

此存储过程将记录插入IsPrimary = 1的表中,并将所有其他标题更新为0

INSERT INTO Titles(...)
    VALUES (...)

UPDATE T
SET IsPrimary = 0
FROM    Titles T
WHERE T.UserID = @UserID AND T.JobTitle != @Title

我在多用户场景中对此进行测试时遇到了死锁问题。如果我从存储过程中删除UPDATE命令,那么一切都运行得很好......

我尝试在查阅列上创建非聚簇索引,并在update语句中尝试使用WITH(ROWLOCK)提示,但似乎没有任何工作。

当我运行sql语句并查看估计的执行计划时,我可以看到更新聚集索引,我认为这是多个用户场景中失败的地方......

我认为这是一个相当简单的场景,很多人应该在高交易系统中实现这种行为,但我找不到任何关于如何处理/解决这个问题的事情,我们将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:0)

您的死锁可能在索引资源上。

在执行计划中查找书签/键查找并创建一个覆盖这些字段的非聚集索引 - 这样,UPDATE数据的“读取”不会与INSERT的“写入”冲突。