SQL Server tidak benar-benar mendukung transaksi bersarang. Hanya ada satu transaksi dalam satu waktu.
Transaksi yang satu ini memiliki penghitung transaksi dasar, @@TRANCOUNT . Setiap begin transaction consecutive menambah penghitung satu per satu, setiap commit transaction menguranginya satu per satu. Hanya commit yang mengurangi penghitung menjadi 0 benar-benar melakukan satu transaksi.
rollback transaction membatalkan satu transaksi dan menghapus @@TRANCOUNT .
Dalam kasus Anda, hasil lucunya adalah SqlStatement3 dijalankan di luar sebuah transaksi! commit terakhir Anda akan mengeluarkan pengecualian "Permintaan TRANSAKSI COMMIT tidak memiliki pengecualian BEGIN TRANSACTION" yang sesuai, tetapi efek dari SqlStatement3 bersifat permanen.
Misalnya:
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
Mencetak 4 . Betulkah. :)