sql >> データベース >  >> RDS >> Sqlserver

SQL Server - ストアド プロシージャ内のネストされたトランザクション

    SP2 によって行われた作業がロールバックされ、SP1 によって行われた作業が失われない可能性があります。ただし、これを行うには、例外処理とネストされたトランザクション :

    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
      

    すべてのエラーが回復できるわけではありません。トランザクションが回復できないエラー状態がいくつかあります。最も明白な例はデッドロックです (デッドロック例外が通知される トランザクションはすでにロールバックされています)。 SP1 と [email protected] の両方 このパターンを使用して記述する必要があります。不正な SP を使用している場合、または ROLLBACK を無意味に発行する既存のストアド プロシージャを単純に活用したい場合



    1. MySQL Select ...インデックスで更新するには、同時実行の問題があります

    2. 開始時にSail.jsの複数の接続

    3. PostgreSQLのJSONデータ型のサイズ制限

    4. 動的に作成されたデータベースへの接続を管理する方法