盡信書不如無書—with(nolock)的迷思

工作遇到某位資深「IT人員」,無論是什麼SELECT語法都要求下屬一定要加上WITH(NOLOCK),今天我就要打破這樣的迷思
所謂WITH(NOLCK)的確可以減少LOCK的發生,但是並不是加上WITH(NOLOCK)就不會造成鎖死(死結),為啥MSSQL會有LOCK
這種東西?!先想想吧!
WITH(NOLOCK)是告訴SQL SERVER這段SELECT無須考慮目前資料表的TRANSACTION  LOCK狀態,
正因為如此,WITH (NOLOCK)不考慮目前table的transaction lock,當有某些資料正處於多個phase交易(例如跨多個table的transaction交易),
WITH (NOLOCK)會讓目前處理交易程序的資料被忽略,看不懂嗎?簡單說,SELECT一個正在交易的TABLE,而交易尚未完成,
因為SELECT加上WITH(NOLCOK)然後發生上述的狀態…………
盡信書不如無書!!別以為加上WITH(NOLOCK)就是萬靈丹!!!
 
附帶一提
WITH (NOLOCK)相當於 READ UNCOMMITTED

WITH (NOLOCK)可以加快查詢的速度

 
——————————————
2009-05-18 補充
舉例來說
A有一百元 他想要領出 十元來花用
A的公司要匯入他當月薪水兩百元
 
如果兩段交易同時進行,那不管那段交易先完成,資料都會是錯的
所以該資料表一定先被LOCK,後面的交易就不能進行,要等到前面的交易完成,
這樣才能確保資料是正確的
 
所以如果不考慮資料表的TRANSACTION LOCK,那A的存款可能會從290元
變成90元,後面匯入的薪資兩百元會無緣無故消失了。
本篇發表於 有時候也很讓人頭痛的SQL。將永久鏈結加入書籤。

4 Responses to 盡信書不如無書—with(nolock)的迷思

  1. hogi 說道:

    英文快要比中文多了 (苦惱鎖眉中)

  2. Yu-Chao 說道:

    我花了一陣子才看懂你在寫啥!好專業啊!不愧是知名遊戲公司的資料庫工程師啊!

  3. mOOn 說道:

    超哥:被你這樣一講我都不好意思了,實際狀況是我也看不懂我在寫啥,果然人的情緒一來,是會胡言亂語的,剛剛做了點補充,這樣應該好懂一些…呵呵

  4. 薩摩亞商相樂股份有限公司 說道:

    太深奧了,那我也來舉個例子我有1個女朋友,想要帶出去跟朋友郊遊我的同行朋友,要再這次郊遊介紹2個正妹給我如果這2件事件同時進行,我會出"包"所以這次郊遊一定要先LOCK,後面的2個正妹就先不能出現,要等到我跟女朋友先處理完,這樣才確保我的生命無虞的所以若不考慮,同時進行,那我有可能從有女朋友,瞬間變成沒女朋友,後面二個正妹也可能無緣無故的消失了。

發表留言