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

Rollback den indre transaktion af indlejret transaktion

SQL Server understøtter ikke rigtig indlejrede transaktioner. Der er kun én transaktion ad gangen.

Denne ene transaktion har en grundlæggende indlejret transaktionstæller, @@TRANCOUNT . Hver på hinanden følgende begin transaction øger tælleren med én, hver commit transaction reducerer det med én. Kun commit der reducerer tælleren til 0, begår virkelig den ene transaktion.

En rollback transaction fortryder den ene transaktion og sletter @@TRANCOUNT .

I dit tilfælde er det sjove resultat, at SqlStatement3 køres udenfor en transaktion! Din endelige commit vil kaste en "COMMIT TRANSACTION-anmodningen har ingen tilsvarende BEGIN TRANSACTION"-undtagelse, men virkningerne af SqlStatement3 er permanente.

For eksempel:

create table #t (col1 int)
insert #t (col1) values (1)
BEGIN TRANSACTION
update #t set col1 = 2 -- This gets rolled back
BEGIN TRANSACTION
update #t set col1 = 3 -- This gets rolled back too
ROLLBACK TRANSACTION
update #t set col1 = 4 -- This is run OUTSIDE a transaction!
COMMIT TRANSACTION -- Throws error
select col1 from #t

Udskriver 4 . Virkelig. :)



  1. Underordnet + overordnet reference SQL

  2. java.sql.SQLEundtagelse:ORA-01843:ikke en gyldig månedsfejl

  3. PHP rekursiv funktion til at slette alle underordnede noder forårsager stackoverflow

  4. 'Relation eksisterer ikke' fejl efter overførsel til PostgreSQL