Qué necesito para utilizar un bloque try..catch, y explícita de reversión en un procedimiento de SQL Server?

Si yo soy la codificación de un SQL Server 2008r2) procedimiento, y me envuelve en una transacción, necesito explícitamente encerrarlo en un bloque try..catch, y, a continuación, llamar explícitamente a la reversión en el bloque catch, o va a salir y reversión de las mismas en su propio?

decir:

Cómo se hace esto:

    begin transaction

    begin try
    delete from....

    insert into...
    end try
    begin catch
    rollback transaction
    return
    end catch

    commit transaction

Comparar con:

    begin transaction
    delete from....

    insert into...
    commit transaction

Gracias por cualquier ayuda.

InformationsquelleAutor Sako73 | 2012-06-08

3 Kommentare

  1. 19

    La respuesta a su pregunta depende de la SET XACT_ABORT configuración:

    Especifica si SQL Server automáticamente revierte la actual
    transacción cuando una instrucción Transact-SQL produce un error en tiempo de ejecución.

    Cuando SET XACT_ABORT es, si una instrucción de Transact-SQL se plantea una
    error en tiempo de ejecución, la totalidad de la transacción se termina y se revierte.

    Cuando SET XACT_ABORT está APAGADO, en algunos casos sólo la instrucción de Transact-SQL
    declaración que provoca el error se revierte y la transacción
    continúa el procesamiento. Dependiendo de la gravedad del error, la
    toda la transacción se puede deshacer, incluso cuando SET XACT_ABORT está APAGADO.
    DESACTIVADO es el valor predeterminado.

    Errores de compilación, tales como errores de sintaxis, no se ven afectados por un CONJUNTO de
    XACT_ABORT.

    Por ejemplo, pruebe con el siguiente código. La primera división por 0, se produce un error, pero continúa la ejecución. La segunda división por cero genera un error de la mano detiene la ejecución:

    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

    Si XACT_ABORT es, entonces, los errores se anulación de la transacción, y usted no necesita un TRY /CATCH.

    Si XACT_ABORT está APAGADO, usted tendrá que comprobar el estado de cada para ver si se ha producido un error:

    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

    Sin embargo, si alguna vez encontrar un caso en el que usted necesita para TRY /CATCH, usted puede necesitar para hacer algo especial cuando se produce el error. Si es así, no te olvides de TRY /CATCH el manejo de excepciones:

    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
  2. 4

    reversiones se producirá automáticamente si hay un error EN la MAYORÍA de los CASOS, PERO NO TODOS los

    si quieres garantizar un rollback para todos los errores preceder el inicio de transacción con SET XACT_ABORT EN

    Mejor práctica es claramente detectar los errores con un bloque try-catch y tomar acción, incluyendo tal vez un rollback y presentación de informes/registrar el error.

  3. 0

    Depende del nivel de gravedad del error. Lo suficientemente alta, 16, tal vez? — el proceso puede detenerse en la línea de error, dejando la transacción abrir y su encaje en su lugar. Si hay alguna posibilidad de error dentro de una transacción, usted definitivamente quiere envolver en el bloque try-catch, como lo hizo en su primer ejemplo.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea