SQL Serverは、ネストされたトランザクションを実際にはサポートしていません。一度に1つのトランザクションしかありません。
この1つのトランザクションには、基本的なネストされたトランザクションカウンター、@@TRANCOUNTがあります。 。連続する各begin transaction commit transactionごとにカウンターを1つずつ増やします それを1つ減らします。 commitのみ カウンターを0に減らすと、実際に1つのトランザクションがコミットされます。
rollback transaction 1つのトランザクションを元に戻し、@@TRANCOUNTをクリアします 。
あなたの場合、面白い結果はSqlStatement3が外部で実行されることです。 トランザクション!最後のcommit 「COMMITTRANSACTIONリクエストには対応するBEGINTRANSACTIONがありません」という例外がスローされますが、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を出力します 。本当。 :)