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
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
Wiederholbares Lesen sperrt nur die Zeilen, die gelesen werden, nur serializable erwirbt Bereichssperren bis zum Ende der Transaktion – TheGameiswar
, um zu sehen, warum Ihre Tabelle blockiert ist. Sehen Sie sys.dm_tran_locks – TheGameiswar