Pregunta

Si creo un Procedimiento almacenado en SQL y lo llamo ( EXEC spStoredProcedure ) dentro de BEGIN / END TRANSACTION, ¿este otro procedimiento almacenado también se incluye en la transacción?

No sabía si funcionaba como prueba / captura en C #.

¿Fue útil?

Solución

Sí, todo que haces entre Comenzar transacción y Confirmar (o Retroceder) es parte de la transacción.

Otros consejos

Suena genial, muchas gracias. Terminé haciendo algo como esto (porque estoy en 05)

    BEGIN TRY
       BEGIN TRANSACTION

       DO SOMETHING

       COMMIT
    END TRY
    BEGIN CATCH
      IF @@TRANCOUNT > 0
         ROLLBACK

      -- Raise an error with the details of the exception
      DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
      SELECT @ErrMsg = ERROR_MESSAGE(),
             @ErrSeverity = ERROR_SEVERITY()

      RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH

Creo que en MS SQL Server la ejecución del procedimiento almacenado ocurriría dentro de la transacción, pero tenga mucho cuidado con esto. Si tiene transacciones anidadas (es decir, una transacción fuera del procedimiento almacenado y una transacción diferente dentro del procedimiento almacenado), una reversión afectará a TODAS las transacciones, no solo a la transacción adjunta más cercana.

Como lo mencionó Chris, debe tener cuidado al deshacer la transacción.

Específicamente esto:

IF @@TRANCOUNT > 0 ROLLBACK

no es siempre lo que quieres. Podrías hacer algo como esto

IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error

De esta manera, el proceso que realiza la llamada puede inspeccionar el valor de retorno del procedimiento almacenado y determinar si desea cometer un error o continuar haciendo que el error continúe.

El motivo es que 'COMPROMISO' solo disminuirá su contador de transacciones. Una vez que disminuya el contador de transacciones a cero, se producirá un compromiso real.

Como Chris y James mencionado, debe tener cuidado al tratar con transacciones anidadas. Hay un conjunto de artículos muy buenos sobre el tema de las transacciones escritas por Don Peterson en SQL Server Centra l, recomendaría leerlos:

Aquí hay:

Sí, todas las llamadas de procedimientos almacenados anidadas se incluyen en el alcance de la transacción. Si está utilizando SQL Server 2005 o superior, también puede usar Try ... Catch. Aquí hay más detalles sobre eso.

@Chris, no lo sabía.

Al buscar en Google para obtener más información, encontré esto - puede establecer 'puntos de salvaguarda', que se pueden revertir sin revertir toda la transacción.

Podría ser útil en esta situación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top