sql >> Database >  >> RDS >> Sqlserver

Wat heeft het voor zin om select-overzichten in een transactie in te sluiten?

Je hebt gelijk:op het standaard isolatieniveau , read committed , hoeft u select-overzichten niet in transacties in te pakken. Select-afschriften worden beschermd tegen vuile lezingen, of u ze nu in een transactie verpakt of niet.

connection 1:                          connection 2:

                                       begin transaction
                                       update user set name = 'Bill' where id = 1
select name from users where id = 1
                                       rollback transaction

De select-instructie leest de teruggedraaide update niet:het maakt niet uit dat ze niet in een transactie zijn verpakt.

Als u herhaalbare leesbewerkingen nodig heeft , dan helpt het niet om selecties in een standaardtransactie in te pakken:

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

De begin en commit uitspraken helpen hier niet:de tweede select mag lees de oude naam, of het mag lees de nieuwe naam.

Als u echter op een hoger isolatieniveau werkt, zoals serializable of repeatable read , wordt de groep beschermd tegen niet-herhaalbare leesbewerkingen:

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

In dit scenario is de update wordt geblokkeerd totdat de eerste transactie is voltooid.

Hogere isolatieniveaus worden zelden gebruikt omdat ze het aantal mensen dat tegelijkertijd in de database kan werken, verlagen. Op het hoogste niveau, serializable , stopt een rapportagequery elke update-activiteit.



  1. Hoe orakel hiërarchische query's naar postgresql te converteren?

  2. Oracle-XMLTYPE:een waarde bijwerken

  3. Hoe bouw je volgende en vorige links met php?

  4. Hoe verbinding maken met IPv6-adressen in Kubernetes die op Google Container Engine worden uitgevoerd?