2016-07-27 7 views
0

Gegeben zwei Transaktionen:Wiederholbare Lese-Isolationsstufe sperrt alle Tabellen für die Aktualisierung?

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; 

starten T1 und während es Einführung T2 ausgeführt wird. Ich dachte, dass die erste Transaktion nur Zeilen mit val=1 sperrt und somit die zweite Transaktion nicht blockiert werden muss, weil andere Zeilen verarbeitet werden. Es stellte sich jedoch heraus, dass die zweite Transaktion wartet, bis sie abgeschlossen ist. Wenn i Standardisolationsstufe verwenden (read committed) für beide von ihnen und führen update mit xlock Hinweis, funktioniert alles wie ich erwartet hatte: sencond man nur blockiert werden, wenn es versucht, Zeilen mit val=1

Antwort

0

zunächst alle Isolationsstufen zu lesen beeinflussen Sie niemals DDL, DML-Anweisungen. Sie sind nur für Select. Zweitens wird ein Update nie die gesamte Tabelle blockieren, außer einige Faktoren wie kein Index (so Table Scan), Sperre eskalieren.

Sie werden blockiert in Ihr Beispiel aufgrund der wiederholbaren Lese-Isolationsstufe, die die ausgewählte gemeinsame Sperre intakt hält, bis die Transaktion festgeschrieben wird

Kommen zu Ihrem Beispiel
1.Select wird niemals die Tabelle blockieren, aber widersprüchliche Sperren auf der Tabelle sind nicht erlaubt, bis die Transaktion abgeschlossen ist. 2. Wenn Ihr Update mehr als 5000 Sperren erwirbt, wird es das Ganze blockieren Tabelle (nicht einmal auswählen)

+0

Ich repetitive readly lesen, um andere Transaktionen daran zu hindern, einige Zeilen zu ändern. Aber warum sperrt es alle Tische? Muss es nicht nur Zeilen sperren, die gelesen wurden? – DotNetter

+0

Wiederholbares Lesen sperrt nur die Zeilen, die gelesen werden, nur serializable erwirbt Bereichssperren bis zum Ende der Transaktion – TheGameiswar

+0

, um zu sehen, warum Ihre Tabelle blockiert ist. Sehen Sie sys.dm_tran_locks – TheGameiswar

Verwandte Themen