sql >> Database teknologi >  >> RDS >> Sqlserver

Hvad er meningen med at vedlægge udvalgte erklæringer i en transaktion?

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



  1. Fejl ved import af CSV til postgres med python og psycopg2

  2. Operational Error:(1045, Adgang nægtet for brugeren 'rajendra'@'localhost' (ved hjælp af adgangskode:NEJ))

  3. Vinduesfunktion i MySQL-forespørgsler

  4. Hvor stor er for stor til et MySQL-bord?