sql >> Databáze >  >> RDS >> Sqlserver

Vrácení vnitřní transakce vnořené transakce

SQL Server ve skutečnosti nepodporuje vnořené transakce. V jednu chvíli existuje pouze jedna transakce.

Tato jedna transakce má základní vnořené počítadlo transakcí @@TRANCOUNT . Každý po sobě jdoucí begin transaction zvýší počítadlo o jeden, každý commit transaction sníží o jednu. Pouze commit který sníží počítadlo na 0, skutečně potvrdí jednu transakci.

rollback transaction zruší jednu transakci a vymaže @@TRANCOUNT .

Ve vašem případě je vtipným výsledkem, že SqlStatement3 je spuštěn venku transakce! Váš poslední commit vyvolá "Požadavek COMMIT TRANSACTION nemá žádnou odpovídající výjimku BEGIN TRANSACTION", ale účinky SqlStatement3 jsou trvalé.

Například:

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

Vytiskne 4 . Opravdu. :)



  1. jak uniknout speciálním znakům v připojovacím řetězci mysql jdbc

  2. Zobrazit poslední dítě v iteraci reakce

  3. Jak obnovím z příkazu drop databáze pomocí binárního protokolu mysql?

  4. Jak mohu vložit dokument XML do PostgreSQL v Javě?