sql >> Databasteknik >  >> RDS >> Sqlserver

Vad är poängen med att bifoga utvalda uttalanden i en transaktion?

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.



  1. SQL Server 2008:hur ger jag privilegier till ett användarnamn?

  2. SQLAlchemy:gruppera efter dag över flera tabeller

  3. mysqli:kan det förbereda flera frågor i ett uttalande?

  4. När indexerar Oracle kolumnvärden null?