He leído a través de MSDN en ROLLBACK TRANSACTION y nesting transactions. Si bien veo el punto de ROLLBACK TRANSACTION savepointname
, no entiendo ROLLBACK TRANSACTION transactionname
.¿Cuál es el sentido de "ROLLBACK TRANSACTION named_transaction"?
- sólo funciona cuando
transactionname
es la transacción más externa ROLLBACK
siempre retrotrae la transacción completa "pila", excepto en el caso desavepointname
Básicamente, al leer la documentación, excepto en el caso de un punto guardado, ROLLBACK
revierte todas las transacciones (a @@TRANCOUNT=0
). La única diferencia que veo es este fragmento:
Si una declaración transaction_name ROLLBACK TRANSACTION usando el nombre de la transacción externa se ejecuta en cualquier nivel de un conjunto de anidados transacciones, todos los transacciones anidadas están retrocediendo. Si se ejecuta una instrucción ROLLBACK WORK o ROLLBACK TRANSACTION sin un parámetro transaction_name en cualquier nivel de un conjunto de transacciones anónimas , revierte todas las transacciones anidadas, incluida , la transacción más externa.
De la lectura, esto me sugiere que al deshacer una transacción con nombre (que debe ser el nombre de la transacción más externa), solo se revertirán las transacciones anidadas. Esto daría algún significado para revertir una transacción con nombre. Así que he creado una prueba:
CREATE TABLE #TEMP (id varchar(50))
INSERT INTO #TEMP (id) VALUES ('NO')
SELECT id AS NOTRAN FROM #TEMP
SELECT @@TRANCOUNT AS NOTRAN_TRANCOUNT
BEGIN TRAN OUTERTRAN
INSERT INTO #TEMP (id) VALUES ('OUTER')
SELECT id AS OUTERTRAN FROM #TEMP
SELECT @@TRANCOUNT AS OUTERTRAN_TRANCOUNT
BEGIN TRAN INNERTRAN
INSERT INTO #TEMP (id) VALUES ('INNER')
SELECT id AS INNERTRAN FROM #TEMP
SELECT @@TRANCOUNT AS INNERTRAN_TRANCOUNT
ROLLBACK TRAN OUTERTRAN
IF @@TRANCOUNT > 0 ROLLBACK TRAN
SELECT id AS AFTERROLLBACK FROM #TEMP
SELECT @@TRANCOUNT AS AFTERROLLBACK_TRANCOUNT
DROP TABLE #TEMP
resultado en (todo "fila de X (s) afectado" cosas eliminado)
NOTRAN
--------------------------------------------------
NO
NOTRAN_TRANCOUNT
----------------
0
OUTERTRAN
--------------------------------------------------
NO
OUTER
OUTERTRAN_TRANCOUNT
-------------------
1
INNERTRAN
--------------------------------------------------
NO
OUTER
INNER
INNERTRAN_TRANCOUNT
-------------------
2
AFTERROLLBACK
--------------------------------------------------
NO
AFTERROLLBACK_TRANCOUNT
-----------------------
0
en cuenta que hay ninguna diferencia a la salida cuando cambio
ROLLBACK TRAN OUTERTRAN
simplemente
ROLLBACK TRAN
Entonces, ¿cuál es el punto de ROLLBACK TRANSACTION named_transaction
?
Remus, gracias. Estoy viendo tu enlace ahora ... –
OK, veo lo que has hecho. Sin embargo, todavía tengo curiosidad sobre mi punto original. Obtengo puntos de guardado y su valor, pero todavía estoy confundido por revertir el nombre de una transacción (no guardar punto). Una nota importante, aparentemente no puedes ROLLBACK una transacción interna. Por ejemplo, ROLLBACK TRAN INNERTRAN da como resultado un error, "No se puede deshacer INNERTRAN. No se encontró ninguna transacción ni se guardó el nombre de ese nombre". Este punto (sobre la reversión de las transacciones anidadas llamadas no autorizadas) se encuentra en los enlaces de documentación que mencioné en el OP. –
'Para retroceder a INNERTRAN necesita usar la sintaxis 'SAVE TRANSACTION INNERTRAN' que crea un verdadero punto de guardado (en lugar de una transacción con nombre). Las transacciones con nombre son principalmente para escenarios de recuperación ('RESTORE WITH STOPAT OUTERTRAN') –