Para que todos los cambios en tu base de datos estén bajo control y se ejecuten correctamente, PostgreSQL usa el concepto de transacción. Es un grupo de operaciones SQL que se ejecutan como una sola unidad. Si algo sale mal, hay que deshacer los cambios. Aquí es donde entran en juego los comandos BEGIN, COMMIT y ROLLBACK.
Los comandos de transacción no son solo para mantener el orden — juegan un papel clave en proteger los datos de errores y fallos. Cuando ejecutas una serie de operaciones SQL, es importante estar seguro de que todo va a funcionar bien: si un comando falla, la base debe volver a su estado original. Esa es una de las razones principales por las que existen los comandos de transacción — ayudan a mantener la coherencia de los datos.
Además, las transacciones aseguran lo que se llama atomicidad: o todos los cambios se aplican juntos, o no se aplica ninguno. Así se evita que la base quede "a medias" — por ejemplo, que el dinero se descuente pero el producto no se agregue al pedido.
Y claro, las transacciones te dan flexibilidad. Puedes construir cadenas de acciones complejas, controlar cuándo confirmarlas con COMMIT o deshacerlas con ROLLBACK, e incluso hacer retrocesos puntuales usando SAVEPOINT. Todo esto hace que trabajar con la base sea no solo seguro, sino también manejable.
Comando BEGIN
El comando BEGIN le dice a PostgreSQL que vas a empezar una transacción. Después de ejecutarlo, todos los cambios que hagas quedan "en el aire" hasta que termines la transacción con COMMIT o deshagas los cambios con ROLLBACK.
Un ejemplo clásico: supón que quieres transferir 100 unidades de moneda de una cuenta a otra. Empiezas la transacción con BEGIN:
BEGIN;
-- Empezamos la transacción
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Disminuimos el saldo en la cuenta 1
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- Aumentamos el saldo en la cuenta 2
Mientras ejecutas comandos dentro de una transacción, otros usuarios de la base de datos no verán tus cambios. Solo serán visibles después de ejecutar COMMIT.
Comando COMMIT
El comando COMMIT termina la transacción y guarda todos los cambios hechos dentro de ella en la base de datos. Después de este comando, los cambios son visibles para todos los usuarios.
Ejemplo de cómo terminar una transacción:
COMMIT;
-- Todos los cambios de la transacción han sido guardados
Ahora los cambios de saldo que hicimos en el ejemplo de arriba ya son "permanentes". El dinero se transfirió con éxito.
Comando ROLLBACK
Si durante la transacción ves que hay un error o decides cancelar los cambios, puedes usar el comando ROLLBACK. Este deshace todas las operaciones hechas después del comando BEGIN.
Supón que durante la transferencia de dinero te das cuenta de que no hay suficiente saldo en la cuenta. Entonces la transacción se revierte:
BEGIN;
-- Empezamos la transacción
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Ups, error: saldo insuficiente.
ROLLBACK;
-- Todos los cambios han sido deshechos, la base de datos vuelve a su estado original
Después del comando ROLLBACK no se guarda ningún cambio en la base de datos. Esto es súper útil para evitar errores.
Ejemplo completo: transferencia de dinero entre cuentas
Vamos a juntar todo. Aquí tienes un ejemplo completo de una transacción — con comprobación de saldo, transferencia de dinero y posibilidad de deshacer en caso de error:
BEGIN;
-- Empezamos la transacción
-- Comprobamos el saldo en la cuenta
SELECT balance INTO current_balance FROM accounts WHERE account_id = 1;
-- Comprobamos si hay suficiente saldo
IF current_balance >= 100 THEN
-- Si hay suficiente saldo, hacemos la transferencia
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
-- Confirmamos los cambios
ELSE
-- Si no hay suficiente saldo, cancelamos la transacción
ROLLBACK;
END IF;
Este ejemplo muestra cómo los comandos de transacción trabajan juntos para evitar inconsistencias en los datos.
IF THEN ELSE END IF — son operaciones de procedimientos almacenados, que veremos en unos niveles:P
Particularidad de la configuración de autocommit
En PostgreSQL, por defecto está activado el modo autocommit, así que si ejecutas comandos fuera de una transacción explícita, se guardan enseguida en la base de datos. Por ejemplo:
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Los cambios se guardan al instante, incluso sin COMMIT
Si quieres controlar las transacciones manualmente, se recomienda usar siempre BEGIN para empezar la transacción de forma explícita.
Puedes desactivar el autocommit para la sesión actual con el comando:
SET AUTOCOMMIT TO OFF;
Recuerda: si el autocommit está desactivado, tendrás que terminar cada sesión con COMMIT o ROLLBACK.
Errores típicos al trabajar con transacciones
Olvidar el COMMIT. Si te olvidas de ejecutar COMMIT, tus cambios quedarán sin terminar y se perderán al cerrar la sesión.
Bloqueos. Mientras la transacción no termine, los recursos que usa pueden quedar bloqueados. Esto puede causar problemas con el acceso concurrente a los datos.
Demasiado ROLLBACK. A veces los programadores son demasiado cuidadosos y revierten la transacción sin necesidad. Esto lleva a cálculos repetidos y aumenta la carga en la base de datos.
Transacciones colgadas. Si empiezas una transacción pero te olvidas de terminarla (ni COMMIT ni ROLLBACK), puede que la sesión se quede colgada y los recursos de la base bloqueados.
Aplicación práctica
En entrevistas para desarrollador o DBA (administrador de base de datos) te pueden preguntar sobre la implementación de transacciones en PostgreSQL. Entender los comandos BEGIN, COMMIT y ROLLBACK demuestra que sabes trabajar con datos de forma segura y eficiente.
En la práctica, las transacciones son especialmente útiles para construir sistemas fiables, por ejemplo, para procesar pedidos en tiendas online o calcular puntos de bonificación en un programa de fidelidad.
Ahora que ya controlas los comandos básicos de transacciones, podemos seguir adelante y meternos en temas más interesantes, como el uso de SAVEPOINT y trabajar con niveles de aislamiento. PostgreSQL es un mar sin fondo de posibilidades, así que prepárate.
GO TO FULL VERSION