Du har ret:på standard isolationsniveau
, read committed
, behøver du ikke pakke udvalgte opgørelser ind i transaktioner. Udvalgte udsagn vil være beskyttet mod beskidte læsninger, uanset om du pakker dem ind i en transaktion eller ej.
connection 1: connection 2:
begin transaction
update user set name = 'Bill' where id = 1
select name from users where id = 1
rollback transaction
Select-erklæringen vil ikke læse den tilbagerullede opdatering:det gør ikke noget, at de ikke er pakket ind i en transaktion.
Hvis du har brug for gentagelige læsninger , så hjælper det ikke at pakke udvalg 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
og commit
Udsagn hjælper ikke her:den anden select
kan læs det gamle navn, eller det må læs det nye navn.
Men hvis du kører på et højere isolationsniveau, såsom serializable
eller repeatable read
, vil gruppen være beskyttet mod ikke-gentagelige læsninger:
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 dette scenarie er update
vil blokere, indtil den første transaktion er gennemført.
Højere isolationsniveauer bruges sjældent, fordi de sænker antallet af personer, der kan arbejde i databasen på samme tid. På højeste niveau, serializable
, standser en rapporteringsforespørgsel enhver opdateringsaktivitet.