2009年5月8日 星期五

盡信書不如無書---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元,後面匯入的薪資兩百元會無緣無故消失了。

4 則留言:

hogi 提到...

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

Yu-Chao 提到...

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

mOOn 提到...

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

薩摩亞商相樂股份有限公司 提到...

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