我有一个非常基本的名为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语句并查看估计的执行计划时,我可以看到更新聚集索引,我认为这是多个用户场景中失败的地方......
我认为这是一个相当简单的场景,很多人应该在高交易系统中实现这种行为,但我找不到任何关于如何处理/解决这个问题的事情,我们将不胜感激。
谢谢。
答案 0 :(得分:0)
您的死锁可能在索引资源上。
在执行计划中查找书签/键查找并创建一个覆盖这些字段的非聚集索引 - 这样,UPDATE数据的“读取”不会与INSERT的“写入”冲突。