https://learn.microsoft.com/zh-cn/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver16
https://learn.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver16
以上官方文檔說(shuō)NOLOCK 等效于 READUNCOMMITTED,不過(guò)我個(gè)人認(rèn)為READUNCOMMITTED是針對(duì)整個(gè)會(huì)話而言,NOLOCK針對(duì)某表而言,就功能而言?xún)烧邲](méi)有太大的區(qū)別
READUNCOMMITTED
指定允許臟讀。 不發(fā)布共享鎖來(lái)阻止其他事務(wù)修改當(dāng)前事務(wù)讀取的數(shù)據(jù),其他事務(wù)設(shè)置的排他鎖不會(huì)阻礙當(dāng)前事務(wù)讀取鎖定數(shù)據(jù)。 允許臟讀可能產(chǎn)生較多的并發(fā)操作,但其代價(jià)是讀取以后會(huì)被其他事務(wù)回滾的數(shù)據(jù)修改。 這可能會(huì)使您的事務(wù)出錯(cuò),向用戶(hù)顯示從未提交過(guò)的數(shù)據(jù),或者導(dǎo)致用戶(hù)兩次看到記錄(或根本看不到記錄)。
READUNCOMMITTED 和 NOLOCK 提示僅適用于數(shù)據(jù)鎖。 所有查詢(xún)(包括那些帶有 READUNCOMMITTED 和 NOLOCK 提示的查詢(xún))都會(huì)在編譯和執(zhí)行過(guò)程中獲取 Sch-S(架構(gòu)穩(wěn)定性)鎖。 因此,當(dāng)并發(fā)事務(wù)持有表的 Sch-M(架構(gòu)修改)鎖時(shí),將阻塞查詢(xún)。 例如,數(shù)據(jù)定義語(yǔ)言 (DDL) 操作在修改表的架構(gòu)信息之前獲取 Sch-M 鎖。 所有并發(fā)查詢(xún)(包括那些使用 READUNCOMMITTED 或 NOLOCK 提示運(yùn)行的查詢(xún))都會(huì)在嘗試獲取 Sch-S 鎖時(shí)被阻塞。 相反,持有 Sch-S 鎖的查詢(xún)將阻塞嘗試獲取 Sch-M 鎖的并發(fā)事務(wù)。
不能為通過(guò)插入、更新或刪除操作修改過(guò)的表指定 READUNCOMMITTED 和 NOLOCK。 SQL Server 查詢(xún)優(yōu)化器忽略 FROM 子句中應(yīng)用于 UPDATE 或 DELETE 語(yǔ)句的目標(biāo)表的 READUNCOMMITTED 和 NOLOCK 提示。
備注:在 SQL Server 的未來(lái)版本中,將不再支持在 FROM 子句中使用應(yīng)用于 UPDATE 或 DELETE 語(yǔ)句目標(biāo)表的 READUNCOMMITTED 和 NOLOCK 提示。 請(qǐng)避免在新的開(kāi)發(fā)工作上下文中使用這些提示,并計(jì)劃修改當(dāng)前使用它們的應(yīng)用程序。
實(shí)驗(yàn)
會(huì)話1
CREATE TABLE testtable1 (h1 int,h2 char(200),h3 char(200))
begin transaction insert1
declare @i int
set @i=1
while @i<1000
begin
insert into testtable1 (h1,h2,h3)
values(@i,'hhhhhh2','hhhhhh3');
set @i=@i+1;
waitfor delay'00:00:01:00'
end
commit transaction insert1
會(huì)話2文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-526480.html
select count(*) from testtable1 with(nolock)
GO
select count(*) from testtable1
在會(huì)話1的事務(wù)提交之前,會(huì)話2執(zhí)行幾次的結(jié)果中,第一條命令select count() from testtable1 with(nolock)的結(jié)果會(huì)增加,比如10,11,12條記錄這樣子,但是select count() from testtable1的結(jié)果一直是0,說(shuō)明with(nolock)確實(shí)讀的是臟數(shù)據(jù),如果會(huì)話2 with(nolock)給用戶(hù)展示數(shù)據(jù)后,會(huì)話1回滾了,那么會(huì)話2 with(nolock)給用戶(hù)展示的數(shù)據(jù)就是錯(cuò)誤數(shù)據(jù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-526480.html
到了這里,關(guān)于Sqlserver 中select with(nolock)等同于READUNCOMMITTED臟讀的理解和實(shí)驗(yàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!