Ejecutar un procedimiento almacenado dentro de la TRANSACCIÓN BEGIN/END
Si creo un Procedimiento almacenado en SQL y lo llamo (EXEC spStoredProcedure
) dentro de la TRANSACCIÓN BEGIN/END, ¿este otro procedimiento almacenado también cae dentro de la transacción?
No sabía si funcionaba como try/catches en C#.
7 answers
Sí, todo que hagas entre la Transacción Begin y Commit (o Rollback) es parte de la transacción.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 20:11:08
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-09 01:05:34
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, transacciones 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 que las encierra más cercana.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 20:11:58
Como Chris mencionó, debe tener cuidado con la devolución de la transacción.
Específicamente esto:
IF @@TRANCOUNT > 0 ROLLBACK
No siempre es lo que quieres. Usted podría hacer algo como esto
IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error
De esta manera, el proc que llama puede inspeccionar el valor devuelto del procedimiento almacenado y determinar si desea confirmar de todos modos o continuar acumulando el error.
La razón es que 'COMMIT' solo disminuirá su contador de transacciones. Una vez que decrementa el contador de transacciones a cero, entonces se producirá una confirmación real.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 21:51:06
Como Chris y James mencionaron, debe tener cuidado al tratar con transacciones anidadas. Hay un conjunto de muy buenos artículos sobre el tema de las transacciones escritas por Don Peterson en SQL Server Centra l, yo recomendaría tener una lectura de los:
Aquí hay:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:33
Sí, todas las llamadas a procedimientos almacenados anidados se incluyen en el ámbito de la transacción. Si está utilizando SQL Server 2005 o superior, puede usar Try...Atrapa también. Aquí hay más detalles sobre eso.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 20:14:53
@ Chris, no sabía eso.
Cuando busqué en Google para obtener más información, me encontré con esto - puede establecer 'savepoints', que se pueden revertir sin revertir toda la transacción.
Podría ser útil en esta situación.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 22:23:14