工作遇到某位資深「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元,後面匯入的薪資兩百元會無緣無故消失了。