2015-03-03 87 views
1

SQL僵局而

在试图IX锁我不明白为什么这种僵局正在发生。 右边的交易影响(更新)只有一行,它看起来像这样:

update table1 
set column1 = 'value1' 
where key1 = 1 

我假设IX请求是其中行(正在更新)所在的页面,对不对?但这不可能,因为这个页面上有一个共享锁。或者是其他页面的IX请求?

也有可能防止IX锁(也许一些提示)?因为我知道我只更新了一行,而且无意更新此事务中的其他任何内容。

更新:

表1 - 由五列(改名)和一个主键:

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语句,包括表1 - 出于安全原因,我不能在这里透露它。

+1

表(包括索引)和选择查询的DDL将会有所帮助。 – Bryan 2015-03-03 14:05:47

+1

*其他*交易做了什么? – usr 2015-03-03 14:09:32

+2

出于安全考虑,我无法回答你的问题 - 至少,你可以尝试将其他查询精确地提取到“column1”和“key1”所做的事情上?你的'UPDATE'可能不是问题 - 即使它锁定了正确的行并且没有其他东西,如果其他查询需要触摸所有东西,这仍然无济于事。你只能通过查看一个参与方来诊断死锁。 – 2015-03-03 15:24:02

回答

0

有一个ROWLOCK提示。例如:

update table1 with (ROWLOCK) 
set column1 = 'value1' 
where key1 = 1 
+0

我试过 - 用(rowlock)导致MS Sql在页面上放置intent锁(IX)以及... 我正在寻找方法来防止IX,作为解决这个死锁问题的可能方案。 – user3664916 2015-03-03 14:03:53

+0

看起来像是忽略了提示。如果您想完全避免锁定,则将事务隔离级别设置为快照可能有效:SET TRANSACTION ISOLATION LEVEL SNAPSHOT – Necreaux 2015-03-03 14:12:18