1

我有一个非常基本的表格,名为 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 语句并查看估计的执行计划时,我可以看到都更新了聚集索引,我认为这是在多用户场景中失败的地方......

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

谢谢你。

4

1 回答 1

0

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

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

于 2012-05-24T13:39:40.063 回答