我有一个非常基本的表格,名为 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 命令,那么一切都很好......
我尝试在查找列上创建非聚集索引,并在更新语句中尝试了 WITH (ROWLOCK) 提示,但似乎没有任何效果。
当我运行 sql 语句并查看估计的执行计划时,我可以看到都更新了聚集索引,我认为这是在多用户场景中失败的地方......
我相信这是一个相当简单的场景,很多人应该在高事务系统中实现这种行为,但我找不到任何关于如何处理/解决这个问题的信息,我们将不胜感激。
谢谢你。