MSSQL WITH (NOLOCK) 脏读
缺點:
1.會產生臟讀
2.只適用與select查詢語句
優點:
1.有些文件說,加了WITH (NOLOCK)的SQL查詢效率可以增加33%。
2.可以用于inner join 語句
臟讀: 一個用戶對一個資源做了修改,此時另外一個用戶正好讀取了這條被修改的記錄,然后,第一個用戶放棄修改,數據回到修改之前,這兩個不同的結果就是臟讀。
詳細內容:
要提升SQL的查詢效能,一般來說大家會以建立索引(index)為第一考慮。其實除了index的建立之外,當我們在下SQL Command時,在語法中加一段WITH (NOLOCK)可以改善在線大量查詢的環境中數據集被LOCK的現象藉此改善查詢的效能。
不過有一點千萬要注意的就是,WITH (NOLOCK)的SQL SELECT有可能會造成Dirty Read(臟讀)。
例如:
SELECT?COUNT(UserID)?FROM?EMPLOYEE?WITH?(NOLOCK)?
JOIN?WORKING_GROUP?WITH?(NOLOCK)?
ON?EMPLOYEE.UserID?=?WORKING_GROUP.UserID
除了簡單的SELECT之外,有JOIN的SELECT語法也是可以使用的。但是DELETE、INSERT、UPDATE這些需要transaction的指令就不行了…
有些文件說,加了WITH (NOLOCK)的SQL查詢效率可以增加33%。
加了WITH (NOLOCK)即告訴SQL Server,我們的這段SELECT指令無需去考慮目前table的transaction lock狀態,因此效能上會有明顯的提升,而且數據庫系統的Lock現象會有明顯的減少(包含Dead Lock)。
有 一點要特別注意,因為WITH (NOLOCK)不考慮目前table的transaction lock,因此當有某些資料正處于多個phase交易(例如跨多個table的transaction交易-->如提款系統),WITH (NOLOCK)會讓目前處理交易process的數據被忽略…
講白話一點,也就是說當使用NoLock時,它允許閱讀那些已經修改但是還沒有交易完成的數據。因此如果有需要考慮transaction事務數據的實時完整性時,使用WITH (NOLOCK)就要好好考慮一下。
如果不需考慮transaction,WITH (NOLOCK)或許是個好用的參考。
注1:WITH ( < table_hint > )
指定由查詢優化器使用的表掃描、一或多個索引,
或由查詢優化器利用此數據表以及為此語句使用鎖定模式。
注2:WITH (NOLOCK)相當于READ UNCOMMITTED
總結
以上是生活随笔為你收集整理的MSSQL WITH (NOLOCK) 脏读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员如何缓解“电脑病”
- 下一篇: SQLIO 模拟随机或者顺序的方式来测试