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
を出力します 。本当。 :)