try transaction stored espaƱol end ejemplos comando begin sql sql-server stored-procedures rollback sqltransaction

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