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