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. :)