Ejecutando un procedimiento almacenado dentro de BEGIN / END TRANSACTION
-
05-07-2019 - |
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 #.
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.