transaction transacciones tipos stored procedimientos ejemplos datos comandos begin anidadas almacenados sql-server transactions

sql server - tipos - Transacciones anidadas en el servidor Sql



transacciones en sql server pdf (5)

Imagine el siguiente escenario:

Estoy usando SQL Server 2005. Tengo una transacción que llama, entre otras declaraciones SQL, un procedimiento almacenado que también tiene una transacción dentro. La transacción externa a veces falla y se revierte después de que se llama al procedimiento almacenado y se confirma con éxito.

Mi pregunta es, ¿también se revierte la transacción del procedimiento almacenado?


Absolutamente sí, la transacción de nivel superior será propietaria de todos los cambios de datos hasta que se confirme o se retrotraiga.

Sin embargo, le recomiendo que piense detenidamente sobre el modelo de transacción. Cuantos más escenarios existan en su sistema, mayor será su exposición a problemas de bloqueo. También aumenta el gasto computacional del procedimiento.

Es notable la frecuencia con la que, al racionalizar SQL, encuentro que las transacciones se han implementado donde simplemente no son necesarias. Lo aliento a usted (y a cualquier persona que trabaje con transacciones) a pensar cuidadosamente sobre por qué los está utilizando en cada contexto y qué sucedería si la transacción no se implementara. ¡Solo vale mi 2c!


Con una transacción anidada, una confirmación no escribe ningún cambio en el disco, a excepción de la transacción de nivel superior. Una reversión, sin embargo, funciona independientemente del nivel de la transacción, por lo que sí, retrotraerá la transacción interna.


Sí, el procedimiento almacenado se revertirá.

Aquí está el flujo general de tu código:

BEGIN TRY BEGIN TRANSACTION EXEC SotredProcedureName --Do some other activity COMMIT TRANSACTION END TRY BEGIN CATCH --IF an error occurs then rollback the current transaction, which includes the stored procedure code. ROLLBACK TRANSACTION END CATCH

Saludos, John


Lo he intentado con begin tran y commit dentro del procedimiento almacenado, digamos usp_test.
Ejecútelos con alguna otra consulta como la siguiente

update x set name=''xxx'' select * from x---contains ''xxx'' begin tran update x set name=''yyy'' select * from x---contains ''yyy'' exec usp_test select * from x---contains ''zzz'' inside the sp rollback tran

Mientras se ejecuta el nombre de la consulta anterior en la tabla x, debe ser ''xxx'', no es ''zzz'', ya que el primer inicio de tran rollbacked incluso el sp tran commit.
Entonces, primero comience a poseer los cambios de datos.