【发布时间】:2014-07-15 20:12:50
【问题描述】:
-
如果表中的一行(没有主键)在对该行进行一些修改(更新查询)时被锁定,我假设首先在表上获取意图锁,然后在获取排他锁之前进行页面在行上。
现在假设某个其他线程希望同时修改(更新查询)同一张表中的某些 other 行,然后 SQL Server 抛出以下错误:
消息 1205,第 13 级,状态 45,第 1 行
事务(进程 ID 65)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务。现在这个错误是否可能是同一张表的其他行在第一个查询的同一数据页中锁定的数据中的原因?
我知道数据页面还选择了我们不要求的其他数据。那么,如果我们在一个表中有一个主键,那么数据页还会选择其他数据还是只选择具有主键的那一行?
【问题讨论】:
-
如果不知道每个 SPID 导致死锁所做的一切,很难说出您的场景中发生了什么。 deadlock example 会帮助你吗?
-
死锁示例突出显示在同一行上进行的更新。我的发生在不同的行上。令我惊讶的是,我通过添加主键(之前没有主键)对表的设计进行了一些更改,并且错误 1205 消失了。我只是想知道为什么当我进行此更改时此错误消失了,因此我想知道我对第二个问题的理解是否正确?
-
那是有道理的。如果没有 PK(或唯一索引),SQL 可能会获取比行锁更大的东西来执行更新。我找不到任何引用,但我相信在没有 PK(或唯一索引)的情况下,SQL 创建了一个底层机制来唯一标识每一行(pageid 与其他内容连接)。但这可能不足以防止页面锁、表锁等。
标签: sql sql-server