Anteriormente realicé una pequeña explicación sobre los tipos y el funcionamiento de las transacciones en SQL Server; continuando con el tema quiero explicar el funcionamiento de las transacciones anidadas en SQL Server.Primero que todo quiero hacer claridad en el resultado de las sentencias COMMIT TRANSACTION y ROLLBACK TRANSACTION cuando se ejecutan en transacciones anidadas ya que es fundamental entender su funcionamiento.Si se ejecuta la sentencia ROLLBACK TRANSACTION se desharán todas las transacciones abiertas hasta ese momento y todas las operaciones Transact Sql que las conforman, por el contrario si se ejecuta la sentencia COMMIT TRANSACTION confirmará únicamente la última transacción abierta por lo cual se debe ejecutar esta sentencia para confirmar cada una de las transacciones que se encuentren abiertas.En los siguientes ejemplos se puede observar el funcionamiento de las transacciones anidadas en SQL Server y cómo son afectadas por las sentencias COMMIT TRANSACTION y ROLLBACK TRANSACTION:
Ejemplo 1:
CREATE TABLE #TABLA1(ID INT, NOMBRE VARCHAR(50))GOCREATE TABLE #TABLA2(ID INT, FECHA DATETIME NOT NULL)GO
BEGIN
TRANSACTION INSERT INTO #TABLA1 VALUES (1,'EJEMPLO') COMMIT TRANSACTIONBEGIN TRANSACTION INSERT INTO #TABLA2 VALUES (1,GETDATE())ROLLBACK TRANSACTION En el ejemplo anterior la sentencia ROLLBACK TRANSACTION deshará todas las transacciones y las operaciones Transact Sql que la conforman aún si ya se había confirmado una de ellas con la sentencia COMMIT TRANSACTION.Ejemplo 2:CREATE TABLE #TABLA1(ID INT, NOMBRE VARCHAR(50))GOCREATE TABLE #TABLA2(ID INT, FECHA DATETIME NOT NULL)GOBEGIN TRANSACTION INSERT INTO #TABLA1 VALUES (1,'EJEMPLO') ROLLBACK TRANSACTION
BEGIN TRANSACTION INSERT INTO #TABLA2 VALUES (1,GETDATE())COMMIT TRANSACTIONEn el ejemplo anterior la sentencia ROLLBACK TRANSACTION deshará la primera transacción y la segunda de ellas será confirmada por la sentencia COMMIT TRANSACTION.Ejecutando la sentencia SELECT @@TRANCOUNTse puede ver cuantas transacciones abiertas se tienen y con la sentencia SELECT * FROM SYSDM_TRAN_ACTIVE_TRANSACTIONS se puede ver un detalle de dichas transacciones.En la conexión actual a SQL Server @@TRANCOUNTse incrementa en 1 (uno) con cada sentencia BEGIN TRANSACTION que se ejecute y se disminuye a 0 (cero) con la ejecucion de la sentencia ROLLBACK TRANSACTION a menos que esta sentencia se ejecute con un Savepoint o punto de recuperación caso en el cual @@TRANCOUNTno sufrirá ningún cambio.Los puntos de recuperación establecen un punto de retorno dentro de la transacción y permiten realizar un ROLLBACK TRANSACTION hasta el último punto guardado sin afectar toda la transacción, a continuación se puede observar un ejemplo:Ejemplo 3:
CREATE TABLE #TABLA1(ID INT, NOMBRE VARCHAR(50))GOCREATE TABLE #TABLA2(ID INT, FECHA DATETIME NOT NULL)GO
BEGIN TRANSACTION INSERT INTO #TABLA1 VALUES (1,'EJEMPLO') INSERT INTO #TABLA2 VALUES (1,GETDATE()) INSERT INTO #TABLA1 VALUES (2,'EJEMPLO') INSERT INTO #TABLA2 VALUES (2,GETDATE())
SAVE TRANSACTION AINSERT INTO #TABLA1 VALUES (3,'EJEMPLO') INSERT INTO #TABLA2 VALUES (3,GETDATE()) INSERT INTO #TABLA1 VALUES (4,'EJEMPLO') INSERT INTO #TABLA2 VALUES (4,GETDATE())
ROLLBACK TRANSACTION A
COMMIT TRANSACTION En el ejemplo anterior la sentencia ROLLBACK TRANSACTION A deshace la transacción y las operaciones Transact Sql que la conforman hasta el Savepoint SAVE TRANSACTION A, posteriormente el resto de la transacción es confirmada por la sentencia COMMIT TRANSACTION.
Próximamente de acuerdo al compromiso realizado en la anterior entrada de este blog, explicare cómo podemos hacer un buen control de errores en las transacciones.