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.