sql >> Database >  >> RDS >> Sqlserver

De interne transactie van geneste transactie terugdraaien

SQL Server ondersteunt niet echt geneste transacties. Er is slechts één transactie tegelijk.

Deze ene transactie heeft een basis geneste transactieteller, @@TRANCOUNT . Elke opeenvolgende begin transaction verhoogt de teller met één, elke commit transaction vermindert het met één. Alleen de commit dat de teller terugbrengt naar 0, begaat echt die ene transactie.

Een rollback transaction maakt de ene transactie ongedaan en wist @@TRANCOUNT .

In jouw geval is het grappige resultaat dat SqlStatement3 buiten wordt uitgevoerd een transactie! Je laatste commit zal een "Het COMMIT TRANSACTION-verzoek heeft geen corresponderende BEGIN TRANSACTION"-uitzondering genereren, maar de effecten van SqlStatement3 zijn permanent.

Bijvoorbeeld:

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

Drukt 4 af . Werkelijk. :)



  1. UPDATE over ogenschijnlijk belangrijke behoudsweergave in Oracle verhoogt ORA-01779

  2. OracleSQL converteert datumvelden naar een andere tijdzone

  3. Is er een stuurprogramma voor mysql op nodejs dat opgeslagen procedures ondersteunt?

  4. Rangschikking op volgorde van datums