2012-04-03 69 views
1

我有一個複雜的查詢(沒有任何鎖定提示)LCK_M_X鎖,從多個表中獲取數據說表1,表2,表3如何解決SQL

下面是代碼檢索數據的代碼(有沒有交易)

IDbCommand sqlCmd = dbHelper.CreateCommand(Helper.MyConnString, sbSQL.ToString(), CommandType.Text, arParms); 
    sqlCmd.CommandTimeout = 300; 
    ds = dbHelper.ExecuteDataset(sqlCmd); 

在應用該查詢運行,每2分鐘

當我火了一個簡單的更新查詢說

Update Table1 set Col1='abc' where ID=100 

(其中ID爲int和主鍵+聚集索引)

更新查詢被延遲,很多時候它是超時 下面是日誌 enter image description here

我怎樣才能解決這個問題。

回答

1

您可以在隔離級別爲SNAPSHOT的事務中執行查詢。這樣,您的查詢將不會獲取任何(共享)鎖,並且您的UPDATE不必等待排它鎖(因爲阻止UPDATE的表上的鎖的源實際上是您的查詢,即應用程序運行每兩分鐘...)

僅供參考,請參閱MSDN上的Working with Snapshot IsolationSET TRANSACTION ISOLATION LEVEL

編輯因發表評論:

首先,打開ALLOW_SNAPSHOT_ISOLATION爲你的數據庫:

ALTER DATABASE YourDB SET ALLOW_SNAPSHOT_ISOLATION ON 

然後,寫出如下查詢:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT; 

SELECT  Column1, Columns2, ... 
FROM  Table1 
LEFT JOIN Table2 
ON   Table1.Columns45 = Table2.Column3 
[... your complex query ...] 

夠長了一個例子?

+0

你能給我一個小例子嗎? – Thakur 2012-04-03 10:10:11

1

如果您不想在修改數據時等待讀取查詢,最好使用READ_COMMITTED_SNAPSHOT

它可以透明地打開,不會影響你的應用程序代碼,並且沒有副作用。

SNAPSHOT有很多副作用,例如,雖然對數據修改沒有鎖定,但在提交時可能存在衝突的數據問題,這些問題非常難以處理。