2015-03-03 71 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