sql >> Databasteknik >  >> RDS >> Sqlserver

Återställ den inre transaktionen för kapslad transaktion

SQL Server stöder egentligen inte kapslade transaktioner. Det finns bara en transaktion åt gången.

Den här transaktionen har en grundläggande kapslad transaktionsräknare, @@TRANCOUNT . Varje på varandra följande begin transaction ökar räknaren med en, varje commit transaction minskar den med en. Endast commit som minskar räknaren till 0 begår verkligen den ena transaktionen.

En rollback transaction ångrar den ena transaktionen och rensar @@TRANCOUNT .

I ditt fall är det roliga resultatet att SqlStatement3 körs utanför en transaktion! Ditt sista commit kommer att kasta ett "BEGÖRELSE TRANSAKTION begäran har inget motsvarande BEGIN TRANSACTION" undantag, men effekterna av SqlStatement3 är permanenta.

Till exempel:

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

Skriver ut 4 . Verkligen. :)



  1. Hur pratar Access med ODBC-datakällor? Del 3

  2. Kontrollera att två datum inte var mellan två ett annat datum + MYSQl

  3. höj applikationsfel Trigger i MySQL DBMS

  4. Laravel:anslut till databaser dynamiskt