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:

  • COMMIT
  • ROLLBACK
  • SAVEPOINT
  • SET 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 último COMMIT.
  • 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...