Transacciones
Una transacción es un conjunto de operaciones que se ejecutan como un bloque indivisible:
👉 Si una falla, fallan todas.
👉 Si todas tienen éxito, se confirman permanentemente.
Por defecto, SQL Server trabaja con transacciones de confirmación automática, es decir, cada instrucción es una transacción independiente y se confirma automáticamente.
📌 Ejemplo sin transacciones
Section titled “📌 Ejemplo sin transacciones”En este caso, cada sentencia se confirma de forma automática, lo que puede generar inconsistencias si una instrucción falla.
DECLARE @importe DECIMAL(18,2), @CuentaOrigen VARCHAR(12), @CuentaDestino VARCHAR(12)
SET @importe = 50SET @CuentaOrigen = '200700000001'SET @CuentaDestino = '200700000002'
UPDATE CUENTASSET SALDO = SALDO - @importeWHERE NUMCUENTA = @CuentaOrigen
INSERT INTO MOVIMIENTOS(IDCUENTA, SALDO_ANTERIOR, SALDO_POSTERIOR, IMPORTE, FXMOVIMIENTO)SELECT IDCUENTA, SALDO + @importe, SALDO, @importe, getdate()FROM CUENTASWHERE NUMCUENTA = @CuentaOrigen
UPDATE CUENTASSET SALDO = SALDO + @importeWHERE NUMCUENTA = @CuentaDestino
INSERT INTO MOVIMIENTOS(IDCUENTA, SALDO_ANTERIOR, SALDO_POSTERIOR, IMPORTE, FXMOVIMIENTO)SELECT IDCUENTA, SALDO - @importe, SALDO, @importe, getdate()FROM CUENTASWHERE NUMCUENTA = @CuentaDestino📌 Tipos de transacciones
Section titled “📌 Tipos de transacciones”- Explícitas → Inician con
BEGIN TRANSACTIONy finalizan conCOMMIToROLLBACK. - Implícitas → Se inician automáticamente al ejecutar instrucciones de modificación, pero deben cerrarse con
COMMIToROLLBACK.
Activar o desactivar transacciones implícitas
Section titled “Activar o desactivar transacciones implícitas”-- ActivarSET IMPLICIT_TRANSACTIONS ON
-- DesactivarSET IMPLICIT_TRANSACTIONS OFF🔹 Ejemplo de transacción explícita
Section titled “🔹 Ejemplo de transacción explícita”DECLARE @importe DECIMAL(18,2), @CuentaOrigen VARCHAR(12), @CuentaDestino VARCHAR(12)
SET @importe = 50SET @CuentaOrigen = '200700000002'SET @CuentaDestino = '200700000001'
BEGIN TRANSACTION
BEGIN TRY UPDATE CUENTAS SET SALDO = SALDO - @importe WHERE NUMCUENTA = @CuentaOrigen
INSERT INTO MOVIMIENTOS (IDCUENTA, SALDO_ANTERIOR, SALDO_POSTERIOR, IMPORTE, FXMOVIMIENTO) SELECT IDCUENTA, SALDO + @importe, SALDO, @importe, getdate() FROM CUENTAS WHERE NUMCUENTA = @CuentaOrigen
UPDATE CUENTAS SET SALDO = SALDO + @importe WHERE NUMCUENTA = @CuentaDestino
INSERT INTO MOVIMIENTOS (IDCUENTA, SALDO_ANTERIOR, SALDO_POSTERIOR, IMPORTE, FXMOVIMIENTO) SELECT IDCUENTA, SALDO - @importe, SALDO, @importe, getdate() FROM CUENTAS WHERE NUMCUENTA = @CuentaDestino
COMMIT TRANSACTIONEND TRY
BEGIN CATCH ROLLBACK TRANSACTION PRINT 'Se ha producido un error!'END CATCH📌 COMMIT vs ROLLBACK
Section titled “📌 COMMIT vs ROLLBACK”COMMIT→ Confirma los cambios de la transacción y los hace permanentes.ROLLBACK→ Revierte los cambios y devuelve la base de datos al estado inicial antes de la transacción.
Advertencia
Si una transacción no tiene un COMMIT, quedará abierta en segundo plano y bloqueará consultas sobre la tabla.
📌 Transacciones anidadas
Section titled “📌 Transacciones anidadas”Podemos abrir varias transacciones dentro de otra.
👉 COMMIT solo afecta a la transacción actual.
👉 ROLLBACK afecta a todas las transacciones abiertas.
BEGIN TRAN UPDATE EMPLEADOS SET NOMBRE = 'Jaime' WHERE ID = 101
BEGIN TRAN UPDATE EMPLEADOS SET APELLIDO1 = 'Pardo' WHERE ID = 101
COMMIT -- Solo confirma la segunda transacciónROLLBACK -- Revierte ambas transacciones📌 Puntos de recuperación (SAVEPOINT)
Section titled “📌 Puntos de recuperación (SAVEPOINT)”Los savepoints permiten marcar un punto dentro de la transacción al que podemos volver con ROLLBACK.
BEGIN TRAN
UPDATE CUENTAS SET SALDO = 1 WHERE IDCUENTA = 1
UPDATE CUENTAS SET SALDO = 2 WHERE IDCUENTA = 2
SAVE TRANSACTION P1
UPDATE CUENTAS SET SALDO = 3 WHERE IDCUENTA = 3
ROLLBACK TRANSACTION P1 -- Revierte solo cambios posteriores a P1
COMMITNota
ROLLBACK no retrocede la ejecución, simplemente deshace los cambios.
Con savepoints, solo se revierten las operaciones posteriores al punto marcado.