SQL Server查詢(xún)語(yǔ)句中用到的鎖
前段時(shí)間**公司DBA來(lái)我們這培訓(xùn)。講了一大堆MYSQL的優(yōu)化。 QA環(huán)節(jié)一程序員問(wèn):“SQL語(yǔ)句中的 with nolock 除了不鎖表外 是否能讀其他鎖住的數(shù)據(jù)"
講課的人嘟嘟了半天沒(méi)解釋清楚(有可能是MYSQL里沒(méi)有這個(gè)機(jī)制),公司的另一程序員給出了一個(gè)很簡(jiǎn)潔明了的回答
WITH NOLOCK 除了本身不鎖表(不加任何鎖) 也不會(huì)受其他的已存在的鎖影響,鎖住的行數(shù)據(jù)也照樣讀
個(gè)人認(rèn)為這句話說(shuō)得很清楚明了,一句話就能說(shuō)明白的事
不過(guò)好奇怪的是程序員經(jīng)常用這個(gè)語(yǔ)句竟然也不去試一下
這里順便總結(jié)一下 其他的 SQLSERVER 中的 with鎖級(jí)別
- WITH NOLOCK:無(wú)鎖
- WITH HOLDLOCK:掛一個(gè)保持鎖
- WITH UPDLOCK:掛一個(gè)更新鎖
- WITH XLOCK:掛一個(gè)排他鎖
需要注意的是 with nolock 是不能用于update,delete insert 這種更新語(yǔ)句的,說(shuō)繞了。簡(jiǎn)單的說(shuō) with nolock 只能用于select
例如:update dbo.test with(NOLOCK) set username='wokofo' --這樣的語(yǔ)句是錯(cuò)誤的
彈回:INSERT、UPDATE、DELETE 或 MERGE 語(yǔ)句的目標(biāo)表不允許使用 NOLOCK 和 READUNCOMMITTED 鎖提示。
實(shí)際使用:
- select top 10 * from dbo.test with(NOLOCK)
- select top 10 * from dbo.test with(HOLDLOCK)
- select top 10 * from dbo.test with(XLOCK)
- select top 10 * from dbo.test with(UPDLOCK)
- update dbo.test with(HOLDLOCK) set username='wokofo'
- update dbo.test with(XLOCK) set username='wokofo'
- update dbo.test with(UPDLOCK) set username='wokofo'
原文鏈接:http://www.cnblogs.com/wokofo/archive/2011/09/07/2169828.html
【編輯推薦】