Modelado físico relacional de bases de datos
¿Qué es TCL?
El Lenguaje de Control de Transacciones (TCL) se utiliza para gestionar las transacciones en una base de datos. Las transacciones son un conjunto de operaciones que se ejecutan como una unidad. TCL ayuda a asegurar que las transacciones sean consistentes y que los cambios se confirmen o deshagan según sea necesario.
Comandos de TCL
Los principales comandos de TCL son:
COMMITROLLBACKSAVEPOINTSET TRANSACTION
Comando COMMIT
El comando COMMIT se utiliza para confirmar una transacción y hacer permanentes los cambios realizados en la base de datos.
Sintaxis:
1COMMIT;
Ejemplo:
1--Puedes usar START TRANSACTION o BEGIN (ambos funcionan), pero START TRANSACTION es más explícito. 2--⚠️ Requiere usar motores como InnoDB (no MyISAM). 3START TRANSACTION; 4 5UPDATE estudiantes 6SET edad = 22 7WHERE nombre = 'Juan'; 8 9COMMIT;
En este ejemplo, primero comenzamos una transacción con BEGIN. Luego, actualizamos la edad del estudiante llamado Juan. Finalmente, usamos COMMIT para confirmar estos cambios y hacerlos permanentes en la base de datos.
Comando ROLLBACK
El comando ROLLBACK se usa para deshacer los cambios realizados desde el último COMMIT o desde un SAVEPOINT si se ha definido uno. Es útil cuando se quiere revertir una transacción debido a un error.
Sintaxis:
1ROLLBACK;
Ejemplo:
1START TRANSACTION; 2 3UPDATE estudiantes 4SET edad = 22 5WHERE nombre = 'Juan'; 6 7-- Un error ocurre aquí 8 9ROLLBACK;
En este caso, aunque se haya realizado un cambio en la base de datos, si se ejecuta ROLLBACK, los cambios no serán guardados y la base de datos volverá a su estado anterior.
Comando SAVEPOINT
El comando SAVEPOINT crea un punto intermedio dentro de una transacción. Puedes usar ROLLBACK para revertir a este punto sin deshacer toda la transacción.
Sintaxis:
1SAVEPOINT nombre_punto;
Ejemplo:
1START TRANSACTION; 2 3UPDATE estudiantes 4SET edad = 22 5WHERE nombre = 'Juan'; 6 7SAVEPOINT punto1; 8 9UPDATE estudiantes 10SET edad = 23 11WHERE nombre = 'Pedro'; 12 13ROLLBACK TO punto1; 14 15COMMIT;
En este ejemplo, después de actualizar la edad de Juan, creamos un punto de guardado llamado punto1. Luego, actualizamos la edad de Pedro. Si ocurre un error después del segundo UPDATE, usamos ROLLBACK TO punto1 para deshacer solo los cambios hechos después de SAVEPOINT, sin afectar la primera actualización de Juan.
Comando SET TRANSACTION
El comando SET TRANSACTION permite configurar el nivel de aislamiento de la transacción, es decir, cómo las transacciones manejan la visibilidad y el acceso a los datos mientras están en ejecución.
Sintaxis:
1SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Los niveles de aislamiento más comunes son:
READ UNCOMMITTED: Permite leer datos no confirmados (más rápido, pero con riesgo de leer datos incorrectos).READ COMMITTED: Solo permite leer datos confirmados.REPEATABLE READ: Previene que los datos leídos sean cambiados durante la transacción.SERIALIZABLE: Garantiza que las transacciones se ejecuten de forma secuencial, sin interferencia.
Ejemplo:
1SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 2 3START TRANSACTION; 4 5UPDATE estudiantes 6SET edad = 22 7WHERE nombre = 'Juan'; 8 9COMMIT;
En este caso, configuramos la transacción para que sea serializable, lo que asegura que no habrá interferencias con otras transacciones que se ejecuten al mismo tiempo.
Resumen de los Comandos de TCL
COMMIT: Confirma todos los cambios realizados en la transacción.ROLLBACK: Revierte todos los cambios realizados desde el últimoCOMMIT.SAVEPOINT: Define un punto intermedio en la transacción, al cual puedes revertir si es necesario.SET TRANSACTION: Establece el nivel de aislamiento para una transacción.
Ejemplo completo 1
- Se inicia la transacción (BEGIN TRANSACTION;).
- Se resta 200 al saldo de Juan.
- Se suma 200 al saldo de María.
- Si todo está bien, usamos COMMIT; para guardar los cambios en la base de datos.
- Si hay un error (como saldo insuficiente), usamos ROLLBACK; para cancelar la transacción.
1import sqlite3 2 3# Conectar a la base de datos (o crearla si no existe) 4conn = sqlite3.connect("banco.db") 5cursor = conn.cursor() 6 7try: 8 # 🔵 Iniciar la transacción 9 conn.execute("BEGIN TRANSACTION;") 10 11 # 🔹 Verificar si Juan tiene suficiente saldo 12 cursor.execute("SELECT saldo FROM cuentas WHERE titular = 'Juan Pérez'") 13 saldo_juan = cursor.fetchone()[0] 14 15 if saldo_juan >= 200: 16 # 🔹 Restar 200 a la cuenta de Juan Pérez 17 cursor.execute("UPDATE cuentas SET saldo = saldo - 200 WHERE titular = 'Juan Pérez'") 18 19 # 🔹 Sumar 200 a la cuenta de María López 20 cursor.execute("UPDATE cuentas SET saldo = saldo + 200 WHERE titular = 'María López'") 21 22 # ✅ Confirmar la transacción 23 conn.commit() 24 print("✅ Transferencia realizada con éxito.") 25 else: 26 # ❌ Si no hay saldo suficiente, cancelar la transacción 27 conn.rollback() 28 print("❌ Error: Saldo insuficiente, transferencia cancelada.") 29 30except Exception as e: 31 # ❌ Si ocurre un error inesperado, cancelar la transacción 32 conn.rollback() 33 print("❌ Error en la transacción:", e) 34 35finally: 36 # 🔴 Cerrar conexión a la base de datos 37 conn.close()
Ejemplo completo 2
- Se inicia la transacción con BEGIN TRANSACTION;
- Se realizan las operaciones (UPDATE) restando 1500€ .
- Si hay un error (como saldo insuficiente), ROLLBACK; cancela la transacción y los datos vuelven a su estado original.
✅ Esto asegura que el dinero no desaparezca por un error en la transferencia.
1import sqlite3 2 3try: 4 # Conectar a la base de datos 5 conn = sqlite3.connect("banco.db") 6 cursor = conn.cursor() 7 8 # Iniciar transacción 9 conn.execute("BEGIN TRANSACTION;") 10 11 # Intentar restar 1500 a Juan Pérez (pero solo tiene 1000) 12 cursor.execute("UPDATE cuentas SET saldo = saldo - 1500 WHERE titular = 'Juan Pérez'") 13 14 # Verificar saldo de Juan 15 cursor.execute("SELECT saldo FROM cuentas WHERE titular = 'Juan Pérez'") 16 saldo_juan = cursor.fetchone()[0] 17 18 # Si el saldo es negativo, cancelar transacción 19 if saldo_juan < 0: 20 raise Exception("Saldo insuficiente, operación cancelada.") 21 22 # Si todo está bien, confirmar transacción 23 conn.commit() 24 print("✅ Transferencia realizada con éxito.") 25 26except Exception as e: 27 # Si hay un error, cancelar transacción 28 conn.rollback() 29 print("❌ Error:", e) 30 31finally: 32 # Cerrar conexión 33 conn.close()
- Loading...