Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kembalikan transaksi dalam dari transaksi bersarang

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Log SQL Server 2008 tidak akan terpotong

  2. SQL Server 2008 dan HashBytes

  3. Impor file .txt ke SQL Server 2008

  4. Cara Memeriksa Pengaturan ANSI_NULLS Sesi Anda di SQL Server

  5. Eksekusi SQL Dinamis di SQL Server