SQL Server всъщност не поддържа вложени транзакции. Има само една транзакция в даден момент.
Тази транзакция има основен вложен брояч на транзакции, @@TRANCOUNT
. Всяка следваща begin transaction
увеличава брояча с единица за всяка commit transaction
го намалява с единица. Само commit
който намалява брояча до 0, наистина ангажира една транзакция.
rollback transaction
отменя една транзакция и изчиства @@TRANCOUNT
.
Във вашия случай забавният резултат е, че SqlStatement3 се изпълнява отвън сделка! Вашият последен commit
ще хвърли изключение „Заявката за COMMIT TRANSACTION няма съответстващо BEGIN TRANSACTION“, но ефектите от SqlStatement3 са постоянни.
Например:
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
Отпечатва 4
. Наистина ли. :)