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

SQL Server - Transaksi bersarang dalam prosedur tersimpan

Pekerjaan yang dilakukan oleh SP2 dimungkinkan untuk digulung kembali dan tidak terlepas dari pekerjaan yang dilakukan oleh SP1. Tetapi agar ini terjadi, Anda harus menulis prosedur tersimpan Anda menggunakan pola yang sangat spesifik, seperti yang dijelaskan dalam Penanganan pengecualian dan transaksi bertingkat :

create procedure [usp_my_procedure_name]
as
begin
    set nocount on;
    declare @trancount int;
    set @trancount = @@trancount;
    begin try
        if @trancount = 0
            begin transaction
        else
            save transaction usp_my_procedure_name;

        -- Do the actual work here

lbexit:
        if @trancount = 0   
            commit;
    end try
    begin catch
        declare @error int, @message varchar(4000), @xstate int;
        select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
        if @xstate = -1
            rollback;
        if @xstate = 1 and @trancount = 0
            rollback
        if @xstate = 1 and @trancount > 0
            rollback transaction usp_my_procedure_name;

        raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
    end catch   
end

Tidak semua kesalahan dapat dipulihkan, ada sejumlah kondisi kesalahan yang tidak dapat dipulihkan oleh transaksi, contoh yang paling jelas adalah kebuntuan (Anda akan diberitahu tentang pengecualian kebuntuan setelah transaksi telah dibatalkan). Baik SP1 dan [email protected] harus ditulis menggunakan pola ini. Jika Anda memiliki SP nakal, atau Anda ingin memanfaatkan prosedur tersimpan yang ada yang mau tidak mau mengeluarkan ROLLBACK pernyataan maka tujuan Anda hilang.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menginstal SQL Server di SUSE 12

  2. Cari Tahu apakah Partisi Dikompresi di SQL Server (T-SQL)

  3. INSERT INTO @TABLE EXEC @query dengan SQL Server 2000

  4. Apa manfaat menggunakan SET XACT_ABORT ON dalam prosedur tersimpan?

  5. Cara Mengubah Kolom dari Null menjadi Tidak Null di SQL Server