2012-08-01 27 views
10

Hola, mi comprensión actual de las transacciones anidadas en TSQL es que si tienes múltiples transacciones (varias transacciones anidadas dentro de una transacción "externa"), todas las partes de tranas deben ser confirmadas (con la transacción "externa" siendo el último) para que se realicen cambios en la base de datos. Si el número de commits es menor que el número de transacciones abiertas, entonces no se realizan cambios relacionados con ninguna de las transacciones. ¿Es esta una descripción correcta de cómo funcionan las transacciones anidadas?Transacciones anidadas en TSQL

Respuesta

12

Su descripción de COMMIT es correcta.

Kalen Delaney has an article covering the same type of behavior that you describe.

Sin embargo, como se discute en el artículo de Kalen, un ROLLBACK dentro de una transacción anidada se deshacer toda la transacción exterior, no sólo la transacción interior donde se produce la reversión.

nota los siguientes resultados:

BEGIN TRAN 
SELECT @@trancount 
BEGIN TRAN 
SELECT @@trancount 
BEGIN TRAN 
SELECT @@trancount 

ROLLBACK TRAN 
SELECT @@trancount 

Esto se describe en el artículo de MSDN, Nesting Transactions:

Un ROLLBACK WORK o un ROLLBACK TRANSACTION que no tiene un nombre de transacción se deshace todas las transacciones y decrementos anidados @@ TRANCOUNT a 0. Una TRANSACCIÓN DE ROLLBACK que utiliza la transacción nombre de la transacción más externa en un conjunto de transacciones anidadas revierte todas las transacciones anidadas y decrementa @@ TRANCOUNT a 0. Cuando no está seguro si ya está en una transacción, SELECCIONE @@ TRANCOUNT para determinar si es 1 o más. Si @@ TRANCOUNT es 0, usted no está en una transacción.

3

En resumen, su respuesta es sí. De Nesting Transactions:

confirmar las transacciones interiores es ignorado por la base de datos de SQL Server motor. La transacción se confirma o se retrotrae según la acción tomada al final de la transacción más externa. Si se confirma la transacción externa , las transacciones anidadas internas también se comprometen con . Si la transacción externa se retrotrae, todas las transacciones internas de también se retrotraen, independientemente de si las transacciones internas de se han comprometido o no por separado.

En cuanto a ROLLBACks, solo se permite ROLLBACK la transacción externa completa.