Masz rację:na standardowym poziomie izolacji
, read committed , nie musisz zawijać wybranych wyciągów w transakcjach. Wybrane wyciągi będą chronione przed brudnymi odczytami, niezależnie od tego, czy zapakujesz je w transakcję, czy nie.
connection 1: connection 2:
begin transaction
update user set name = 'Bill' where id = 1
select name from users where id = 1
rollback transaction
Instrukcja select nie odczyta wycofanej aktualizacji:nie ma znaczenia, że nie są one zawarte w transakcji.
Jeśli potrzebujesz powtarzalnych odczytów , a następnie zawijanie zaznaczeń w domyślną transakcję nie pomaga:
connection 1: connection 2:
begin transaction
select name from users where id = 1
update user set name = 'Bill' where id = 1
select name from users where id = 1
commit transaction
begin i commit instrukcje tu nie pomogą:drugi select może przeczytaj starą nazwę lub może przeczytaj nową nazwę.
Jeśli jednak pracujesz na wyższym poziomie izolacji, na przykład serializable lub repeatable read , grupa będzie chroniona przed jednorazowymi odczytami:
connection 1: connection 2:
set transaction isolation level
repeatable read
begin transaction
select name from users where id = 1
update user set name = 'Bill' where id = 1
select name from users where id = 1 |
commit transaction |
|--> executed here
W tym scenariuszu update zostanie zablokowany do czasu zakończenia pierwszej transakcji.
Wyższe poziomy izolacji są rzadko używane, ponieważ zmniejszają liczbę osób, które mogą jednocześnie pracować w bazie danych. Na najwyższym poziomie, serializable , zapytanie raportujące wstrzymuje wszelkie działania związane z aktualizacją.