He querido dedicar la primera entrada de este blog a una pequeña explicación sobre los tipos y el funcionamiento de las transacciones en SQL Server. Las transacciones son utilizadas para garantizar la integridad de un conjunto de operaciones Transact Sql en donde se confirmara el resultado de todas ellas únicamente si no se presenta algún error, de lo contrario se deshacen todas las operaciones que hacen parte de la transacción.
En SQL Server existen tres tipos de transacciones, autocommit o de confirmación automática, las implícitas y las explicitas.
SQL Server maneja por defecto las transacciones en modo autocommit o de confirmación automática lo que quiere decir que cada instrucción individual es una transacción; SQL Server las inicia y las termina automáticamente si no han sido definidas explícitamente.
Las transacciones implícitas son aquellas que inicia SQL Server automáticamente en caso de que no exista alguna transacción abierta, pero que no realizan automáticamente un COMMIT TRANSACTION o ROLLBACKTRANSACTION; como mencioné anteriormente por defecto SQL Server maneja las transacciones autocommit por lo cual para usar las transacciones implícitas es necesario ajustar SQL Server mediante la sentencia SET IMPLICIT_TRANSACTIONSON o activando la opción ANSI_DEFAULTS mediante la sentencia SET ANSI_DEFAULTS ON.
Si no existe ninguna transacción abierta y se ejecuta alguna de las sentencias ALTER TABLE, CREATE, DROP, GRANT, REVOKE, OPEN, FECTH, INSERT, UPDATE, DELETE, SELECT o TRUNCATE TABLE, se inicia una transacción implícita.
El siguientes es un ejemplo de una transacción implícita:
SETIMPLICIT_TRANSACTIONS ON
DELETEFROM PRODUCTOSWHERE VALOR < 10000
COMMITTRANSACTION
Las transacciones implícitas permanecen abiertas hasta que se abre otra nueva transacción en la misma sesión o hasta que se ejecute la sentencia COMMIT TRANSACTION o ROLLBACK TRANSACTION.
Las transacciones explicitas son aquellas en donde se define de manera explícita el inicio y el fin de las mismas mediante las sentencias BEGIN TRANSACTION y COMMITTRANSACTION (cuando finaliza sin errores) o ROLLBACK TRANSACTION(cuando se presenta algún error).
BEGINTRANSACTION
INSERTINTO PRODUCTOS(ID, NOMBRE, VALOR) VALUES (1,'TORNILLOS',500)
DELETE FROM DETALLE_PEDIDOS WHEREID_PRODUCTO = 1
COMMITTRANSACTION
La sentencia COMMIT TRANSACTIONse encarga de confirmar la transacción y todas las operaciones Transact Sql que la conforman, por el contrario la sentencia ROLLBACKTRANSACTION se encarga de deshacer la transacción y todas las operaciones Transact Sql que la conforman.
Próximamente profundizare un poco más en el tema de las transacciones explicando el funcionamiento de las transacciones anidadas y cómo podemos hacer un buen control de errores en las mismas.