2010-10-04 75 views
11

我的理解是,當在SELECT語句中使用NOLOCK時,它也可以讀取未提交/髒行。但我想利用桌面上的NOLOCK提示,以便我的SELECT查詢能夠快速運行。SELECT語句 - NOLOCK與SET TRANSACTION隔離級別READ COMMITTED

現在,NOLOCK在表上,但隨着「SET TRANSACTION ISOLATION LEVEL READ COMMITTED」給我NOLOCK的優勢和更快的SELECT查詢(由於NOLOCK)只提交行(因爲SET)?

回答

17

是表提示覆蓋隔離級別設置,所以你仍然會得到髒讀

容易測試

第一次運行該

create table bla(id int) 
insert bla values(1) 



begin tran 
select * from bla with (updlock, holdlock) 

確保不提交TRAN! 打開另一個窗口並運行這個

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

select * from bla -- with (nolock) 

你什麼都沒得到。

打開另一個窗口,現在運行這個

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

select * from bla with (nolock) 

,你可以看到你會回來的行

BTW,READ COMMITTED是默認的隔離級別,沒有必要設置

看看Snapshot Isolation這不會給你回髒數據,但仍然不會鎖定

相關問題