Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server - Transakcje zagnieżdżone w procedurze składowanej

Możliwe jest, że praca wykonana przez dodatek SP2 zostanie wycofana i nie straci pracy wykonanej przez dodatek SP1. Ale aby tak się stało, musisz napisać swoje procedury składowane przy użyciu bardzo konkretnego wzorca, jak opisano w Obsługa wyjątków i transakcje zagnieżdżone :

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

Nie wszystkie błędy można naprawić, istnieje szereg warunków błędów, z których transakcja nie może się naprawić, najbardziej oczywistym przykładem jest zakleszczenie (jesteś powiadamiany o wyjątku zakleszczenia po transakcja została już wycofana). Zarówno SP1 jak i [email protected] muszą być napisane przy użyciu tego wzoru. Jeśli masz nieuczciwy SP lub chcesz w prosty sposób wykorzystać istniejące procedury składowane, które nie chcą wydawać ROLLBACK oświadczeń, wtedy Twoja sprawa jest przegrana.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wybór procesora dla SQL Server 2014 – część 1

  2. SQL Server i niejawna konwersja typów

  3. Sformatuj numer telefonu w programie SQL Server (T-SQL)

  4. Wybierz kolumnę w SQL, która nie znajduje się w Grupuj według

  5. EF5:Nie można dołączyć pliku „{0}” jako bazy danych „{1}”