Du har rätt:på standard isoleringsnivå
, read committed
, behöver du inte slå in utvalda uttalanden i transaktioner. Vissa uttalanden kommer att skyddas från smutsiga läsningar oavsett om du lindar in dem i en transaktion eller inte.
connection 1: connection 2:
begin transaction
update user set name = 'Bill' where id = 1
select name from users where id = 1
rollback transaction
Select-satsen kommer inte att läsa den återställda uppdateringen:det spelar ingen roll att de inte är inpackade i en transaktion.
Om du behöver repeterbara läsningar , då hjälper det inte att slå in markeringar i en standardtransaktion:
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
och commit
uttalanden hjälper inte här:den andra select
kan läs det gamla namnet, eller det kan läs det nya namnet.
Men om du kör på en högre isoleringsnivå, som serializable
eller repeatable read
, kommer gruppen att skyddas från icke-repeterbara läsningar:
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
I det här scenariot visas update
blockeras tills den första transaktionen är klar.
Högre isoleringsnivåer används sällan eftersom de minskar antalet personer som kan arbeta i databasen samtidigt. På högsta nivå, serializable
, stoppar en rapportfråga all uppdateringsaktivitet.