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

SQL Server プロシージャで try..catch ブロックと明示的なロールバックを使用する必要がありますか?

    あなたの質問に対する答えは、SET XACT_ABORT によって異なります。 設定:

    たとえば、次のコードを試してください。最初の 0 除算でエラーが発生しますが、実行は続行されます .ゼロによる 2 番目の除算はエラーを発生させ、実行を停止します:

    begin transaction
    
    set xact_abort off
        
    select 1 / 0 -- causes divide by zero error, but continues
    select @@trancount -- returns 1
    
    set xact_abort on
    
    select 1 / 0 -- causes divide by zero error and terminates execution
    select @@trancount -- we never get here
    
    rollback
      

    XACT_ABORT が ON の場合、エラーによってトランザクションが中止され、TRY / CATCH は必要ありません。

    XACT_ABORT が OFF の場合、各ステートメントのステータスをチェックして、エラーが発生したかどうかを確認する必要があります:

    begin transaction
    
    delete from...
    if @@error <> 0
    begin
        if @@trancount > 0
            rollback
        return
    end
    
    insert into...
    if @@error <> 0
    begin
        if @@trancount > 0
            rollback
        return
    end
    
    commit
      

    ただし、TRY / CATCH が必要なケースが見つかった場合は、エラーが発生したときに何か特別なことを行う必要がある場合があります。その場合は、例外処理を TRY / CATCH することを忘れないでください:

    begin transaction
    
    set xact_abort on
    
    begin try
        select 1 / 0 -- causes divide by zero error and terminates execution
        select @@trancount -- we never get here
        commit
    end try
    begin catch
        select xact_state() -- this will be -1 indicating you MUST rollback before doing any other operations
        select @@trancount -- this will probably be one, because we haven't ended the transaction yet
        if xact_state() <> 0
        begin try
            select 'rollback'
            rollback
            
            -- do something to handle or record the error before leaving the current scope
            select 'exception processing here'
            --insert into...
        end try
        begin catch
            -- ignore rollback errors
        end catch
        
    end catch
      

    1. ローカルからmysqldockerに接続できません

    2. mysqlはフィールド内の特殊文字の出現をカウントします

    3. メインクエリデータ変数を使用したMySQLサブクエリ

    4. XAMPPインストールでMySQLInnoDBストレージエンジンのサポートを有効にする