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.
Este es un artículo útil para entender las transacciones en SQL Server
ofrece una serie de buenos ejemplos y definiciones simples.