SQL Server ne prend pas vraiment en charge les transactions imbriquées. Il n'y a qu'une seule transaction à la fois.
Cette transaction a un compteur de transaction imbriqué de base, @@TRANCOUNT . Chaque begin transaction consécutif incrémente le compteur de un, chaque commit transaction le réduit de un. Seul le commit qui réduit le compteur à 0 valide réellement la seule transaction.
Une rollback transaction annule la transaction et efface @@TRANCOUNT .
Dans votre cas, le résultat amusant est que SqlStatement3 est exécuté à l'extérieur une opération ! Votre commit final lèvera une exception "La demande COMMIT TRANSACTION n'a pas de BEGIN TRANSACTION correspondante", mais les effets de SqlStatement3 sont permanents.
Par exemple :
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
Imprime 4 . Vraiment. :)