在你的情況,我建議明確設置隔離級別快照 - 這將阻止通過防止鎖獲得在寫入(插入和更新)的方式讀,但那些讀取仍然是「好」的讀取(即不是髒數據 - 它不是一樣的NOLOCK)
通常我發現,我有我的查詢鎖定問題,我手動控制應用的鎖。例如我會使用行級鎖執行更新以避免頁/表級鎖定,並將我的讀取設置爲readpast(接受我可能會錯過某些數據,在某些情況下可能會好) 鏈接|編輯|刪除|標記
EDIT--綜合所有的評論到答案
作爲優化過程的一部分,SQL服務器避免越來越COMMITED讀取它知道沒有改變一個頁面上,並自動回落到較低的鎖定策略。在你的情況下,sql server從可串行讀取下降到可重複讀取。
問:感謝有關降低隔離級別的有用信息。你能想到它首先會使用Serializable IsolationLevel的任何理由,因爲我們不使用SELECT的顯式事務 - 我們知道隱式事務將使用ReadCommitted?
答:默認情況下,SQL Server將使用Read Commmited(如果這是您的默認隔離級別),但如果您沒有在查詢中額外指定鎖定策略,則基本上是對sql服務器說:「做你認爲最好的,但我的首選是Read Commited「。由於SQL Server可以自由選擇,因此它可以優化查詢。 (sql server中的優化算法非常複雜,我自己也不完全理解它)。在事務中不顯式執行不會影響sql server使用的隔離級別。
問:最後一件事,SQL Server是否會增加隔離級別(可能需要鎖的數量)以優化查詢似乎是合理的?我也想知道,如果它繼承了上次使用的隔離級別,重用連接池是否會影響這一點?
答:Sql服務器將會這樣做,稱爲「鎖定升級」的過程的一部分。從http://support.microsoft.com/kb/323630,我引用:「Microsoft SQL Server動態地決定何時執行鎖定升級。當做出這個決定時,SQL Server會考慮在特定掃描中保留的鎖的數量,整個鎖的數量事務,以及整個系統中用於鎖定的內存。通常,SQL Server的默認行爲會導致鎖定升級,這些鎖定升級僅發生在可以提高性能的那些點上,或者必須將過多的系統鎖內存減少到更多但是,某些應用程序或查詢設計可能會在不需要的時候觸發鎖升級,並且升級的表鎖可能會阻止其他用戶「。
儘管鎖升級與改變隔離級別並不完全相同,但是查詢運行得很好,這讓我感到驚訝,因爲我不希望sql server比默認隔離級別允許的更多的鎖。
沒問題灰。感謝有關降低隔離級別的有用信息。你能想到它首先會使用Serializable IsolationLevel的任何理由,因爲我們不使用SELECT的顯式事務 - 我們知道隱式事務將使用ReadCommitted? – Graham 2009-08-27 07:38:03
謝謝阿什。如果您將您的評論與答案結合起來,我會將其標記爲答案併爲您投票。 – Graham 2009-08-27 13:34:40
最後一件事,SQL Server是否會增加隔離級別(並且可能是所需的鎖的數量)來優化查詢似乎是合理的?我也想知道,如果它繼承了上次使用的隔離級別,重用連接池是否會影響這一點? – Graham 2009-08-27 13:48:22