Прав сте:на стандартното ниво на изолация
, read committed , не е необходимо да обвивате избрани отчети в транзакции. Изявленията за избор ще бъдат защитени от мръсни четения, независимо дали ги обвивате в транзакция или не.
connection 1: connection 2:
begin transaction
update user set name = 'Bill' where id = 1
select name from users where id = 1
rollback transaction
Операторът select няма да прочете върнатата актуализация:няма значение, че те не са обвити в транзакция.
Ако имате нужда от повтарящи се четения , тогава обвиването на селектирания в транзакция по подразбиране не помага:
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 и commit изразите няма да помогнат тук:вторият select може прочети старото име, инакможе прочетете новото име.
Ако обаче работите на по-високо ниво на изолация, като serializable или repeatable read , групата ще бъде защитена от неповтарящи се четения:
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
В този сценарий update ще блокира до завършване на първата транзакция.
Рядко се използват по-високи нива на изолация, тъй като те намаляват броя на хората, които могат да работят в базата данни едновременно. На най-високо ниво, serializable , заявка за докладване спира всяка дейност по актуализиране.