【发布时间】:2015-03-03 13:33:31
【问题描述】:
我不明白为什么会发生这种死锁。 右边的事务只影响(更新)一行,看起来像这样:
update table1
set column1 = 'value1'
where key1 = 1
我假设 IX 请求是针对行(正在更新)所在的页面,对吧?但那不可能,因为这个页面上有一个共享锁。或者是其他页面的 IX 请求?
还有可能防止 IX 锁定(也许是一些提示)?因为我知道我只更新了一行,并且没有打算更新此事务中的任何其他内容。
更新:
Table1 - 由五列(重命名)和一个主键组成:
CREATE TABLE [dbo].[Table1](
[Key1] [int] IDENTITY(1,1) NOT NULL,
[Column1] [nvarchar](50) NOT NULL,
[Column2] [int] NOT NULL,
[Column3] [nvarchar](50) NULL,
[Column4] [int] NOT NULL,
constraint PK_Key1 primary key([Key1])
)
另一个事务由一个单独的 select 语句组成,其中包含许多连接表,包括 Table1 - 出于安全原因,我不能在这里透露。
【问题讨论】:
-
表(包括索引)的 DDL 和选择查询会很有帮助。
-
other 事务有什么作用?
-
出于安全原因,我无法回答您的问题——也许您至少可以尝试将其他查询提炼成与
column1和key1完全相同的查询?您的UPDATE可能不是问题——即使它锁定了正确的行而不是其他任何东西,如果其他查询需要触及所有内容,那仍然无济于事。您不能(通常)仅通过查看相关方来诊断死锁。 -
我们在这里谈论多少锁争用?您能否将此更新查询上的deadlock priority 设置为低以使其始终成为受害者,并在发生死锁时简单地重新运行它?你的其他进程可以使用 HOLDLOCK 或 SERIALIZABLE 吗?
标签: sql sql-server deadlock