2016-07-27 60 views
0

由於兩筆交易:可重複讀取隔離級別鎖定所有表以進行更新嗎?

T1

set transaction isolation level repeatable read; 

begin transaction 
select * from tmp where val=1; 
update tmp set txt='rerwer11' where val=1; 

waitfor delay '00:00:7'; 

commit; 

T2

set transaction isolation level repeatable read; 

begin transaction 

select * from tmp where val=2; 
update tmp set txt='rerwer11' where val=2; 

commit; 

開始T1,雖然它在執行發射T2。我認爲第一個事務只鎖定val=1的行,因此第二個事務不必被阻塞,因爲處理了其他行。但事實證明,第二筆交易等待第一次完成。 如果我使用默認隔離級別(讀提交)對他們倆的,並與xlock提示運行update,一切就像我預期的:如果它試圖與val=1

回答

0

首先隔離級別的讀取行sencond一個只得到受阻從不影響DDL,DML語句。它們僅用於選擇..其次,更新將永遠不會阻塞整個表格,除非考慮到某些因素(如表掃描),鎖定升級等因素。

您遇到阻塞由於可重複讀取隔離級別,您的示例會保持選擇共享鎖不動,直到事務提交爲止

來你的例子
1.選擇將永遠不會阻止表,但在交易完成前不允許在表上衝突的鎖
2.如果您的更新獲取超過5000個鎖,那麼它將阻止整個表(甚至沒有選擇)

+0

我訴諸可重複的讀取以防止其他事務修改某些行。但爲什麼它鎖定所有表?是否只需鎖定已讀取的行? – DotNetter

+0

可重複讀取鎖只讀正在讀取的行,只有可序列化獲取範圍鎖直到事務結束 – TheGameiswar

+0

查看爲什麼表被阻止,請參閱sys.dm_tran_locks – TheGameiswar

相關問題