我的老闆一直強迫我用with (nolock)
編寫SELECT查詢來防止死鎖。但是AFAIK,Select語句默認沒有鎖,所以選擇with (nolock)
並選擇沒有沒有什麼區別。如果我錯了,請糾正我。選擇(nolock)
這兩個查詢:
SELECT * from EMP with (nolock)
SELECT * from EMP
是不是都是一樣的。如果我不放置nolock,它會容易陷入僵局嗎?請告訴我我應該使用什麼。
我的老闆一直強迫我用with (nolock)
編寫SELECT查詢來防止死鎖。但是AFAIK,Select語句默認沒有鎖,所以選擇with (nolock)
並選擇沒有沒有什麼區別。如果我錯了,請糾正我。選擇(nolock)
這兩個查詢:
SELECT * from EMP with (nolock)
SELECT * from EMP
是不是都是一樣的。如果我不放置nolock,它會容易陷入僵局嗎?請告訴我我應該使用什麼。
Nolocks應該非常小心使用。對nolock最常見的理解(讀取未提交)提示是它讀取尚未提交的數據。但是,還有其他副作用可能非常危險。 (搜索「NOLOCK」和「頁面拆分」)
有一個非常好的寫在這裏... http://sqlmag.com/sql-server/beware-nolock-hint
總之,「nolocking」荷蘭國際集團的一切並不總是一個好主意......如果有的話。
假設我們有默認的事務隔離級別READ COMMITTED,即使在一個非常簡單的SELECT語句中也有可能發生死鎖,假設一個場景,其中User1只讀數據,User2嘗試更新一些數據,該表上的聚簇索引,這是可能的。
用戶1正在讀取一些數據,併爲了執行查找獲得關於非聚集索引共享鎖,然後嘗試獲取以返回數據contianing的數據頁上的共享鎖本身。
正在寫入/更新的用戶2首先獲取包含數據的數據庫頁面上的絕對鎖定,然後嘗試獲取索引的獨佔鎖定以更新索引。
http://stackoverflow.com/questions/686724/sql-when-should-you-use-with-nolock – Bharadwaj
這取決於。在高插入情況下,使用(nolock)可能會讀取不正確的數據(不僅僅是陳舊的數據)。 http://www.brentozar.com/archive/2011/11/theres-something-about-nolock-webcast-video/修正實際問題,而不是症狀。如果你所做的只是在SSMS中查詢太大(選擇*),太大(沒有WHERE子句)查詢數據(如上面的例子),那麼YES,使用(nolock) –
這裏是另一個關於主題http://stackoverflow.com/questions/1452996/is-the-nolock-sql-server-hint-bad-practice?rq=1 – Alex