sql - stored - Ejecutar un procedimiento almacenado dentro de BEGIN/END TRANSACTION
if sql server (7)
@ Chris, yo no sabía eso.
Cuando busqué en Google más información, me encontré con this : puede establecer ''puntos de guardado'', que se pueden revertir sin revertir toda la transacción.
Podría ser útil en esta situación.
Si creo un Procedimiento almacenado en SQL y lo llamo ( EXEC spStoredProcedure
) dentro de BEGIN / END TRANSACTION, ¿este otro procedimiento almacenado también cae dentro de la transacción?
No sabía si funcionaba como try / catch en C #.
Como mencionó Chris, deberías tener cuidado con la devolución de 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 forma, el proceso de llamada puede inspeccionar el valor de retorno del procedimiento almacenado y determinar si desea comprometerse de todos modos o continuar produciendo el error.
La razón es que ''COMPRAR'' simplemente disminuirá su contador de transacciones. Una vez que disminuye el contador de transacciones a cero, se producirá una confirmación real.
Como mencionaron Chris y James , debe tener cuidado cuando se trata de 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 tener una lectura de aquellos:
Aquí están:
Creo en MS SQL Server que la ejecución del procedimiento almacenado ocurriría dentro de la transacción, pero ten mucho cuidado con esto. Si tiene transacciones anidadas (es decir, transacción fuera del procedimiento almacenado y una transacción diferente dentro del procedimiento almacenado), una reversión afectará TODAS las transacciones, no solo la transacción circundante más cercana.
Sí, todo lo que haces entre Begin Transaction y Commit (o Rollback) es parte de la transacción.
Sí, todas las llamadas a procedimientos almacenados anidados se incluyen en el alcance de la transacción. Si está utilizando SQL Server 2005 o posterior, puede usar Try ... Catch también. Here hay más detalles sobre eso.
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