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ą.