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#.

Author: CDspace, 2008-10-07

7 answers

Sí, todo que hagas entre la Transacción Begin y Commit (o Rollback) es parte de la transacción.

 36
Author: Blorgbeard,
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
 11
Author: Miles,
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.

 5
Author: Chris Shaffer,
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.

 5
Author: James,
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:

 2
Author: kristof,
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.

 1
Author: Ben Hoffstein,
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.

 1
Author: Blorgbeard,
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