Quizás estos dos
gráficos nos ayuden a entender el comportamiento de estas
sentencias cuando hay varios niveles de anidamiento
Comportamiento del COMMIT
TRAN
Comportamiento de ROLLBACK
TRAN
Como siempre un ejemplo es
lo mejor para entender como funciona.
CREATE
TABLE Test (Columna int)
GO
BEGIN
TRAN TranExterna -- @@TRANCOUNT ahora es 1
SELECT El nivel de anidamiento es, @@TRANCOUNT
INSERT INTO Test VALUES (1)
BEGIN TRAN TranInterna1 -- @@TRANCOUNT ahora es 2.
SELECT El nivel de anidamiento es, @@TRANCOUNT
INSERT INTO Test VALUES (2)
BEGIN TRAN TranInterna2 -- @@TRANCOUNT ahora es 3.
SELECT El nivel de anidamiento es, @@TRANCOUNT
INSERT INTO Test VALUES (3)
COMMIT TRAN TranInterna2 -- Reduce @@TRANCOUNT a 2.
-- Pero no se guarda nada en la base de datos.
SELECT El nivel de anidamiento es, @@TRANCOUNT
COMMIT TRAN TranInterna1 -- Reduce @@TRANCOUNT a 1.
-- Pero no se guarda nada en la base de datos.
SELECT El nivel de anidamiento es, @@TRANCOUNT
COMMIT
TRAN TranExterna -- Reduce @@TRANCOUNT a 0.
--
Se lleva a cabo la transacción externa y todo lo que conlleva.
SELECT
El nivel de anidamiento es, @@TRANCOUNT
SELECT
* FROM Test
Por cierto que lo de usar
nombre para las transacciones es por claridad, puesto que COMMIT TRAN como
ya hemos dicho solamente reduce en 1 el valor de @@TRANCOUNT.
«
Atras | Continua
Aqui » |