Transacciones ACID en Bases de Datos: Teoría y Práctica
Resumen
¿Qué es una transacción en bases de datos?
Las transacciones en bases de datos son secuencias de operaciones tratadas como una sola acción. Su objetivo es asegurar que las operaciones realizadas sean coherentes y seguras, especialmente en sistemas que requieren alta fiabilidad, como los sistemas bancarios.
Atomicidad: Las transacciones son atómicas, lo que significa que todas las operaciones dentro de la transacción deben completarse satisfactoriamente. Si alguna falla, se debe revertir todo el cambio.
¿Cómo se inician y ejecutan las transacciones?
Para iniciar una transacción, utilizamos el comando BEGIN. Al finalizar las operaciones necesarias, es primordial asegurar los cambios con COMMIT. Si hay que deshacer los cambios porque algo salió mal, usamos ROLLBACK.
BEGIN;-- inserciones y otras operacionesCOMMIT;
¿Qué pasa si falla algo?
Si alguna de las operaciones de la transacción falla, la base de datos usará ROLLBACK para regresar a su estado anterior y revertir todas las transacciones realizadas hasta ese momento.
¿Cómo funciona el Autocommit en PGAdmin?
PGAdmin, por defecto, tiene activado el Autocommit, lo que significa que cada operación se guarda automáticamente. Para manejar transacciones manualmente, debes desactivar esta opción.
Desactivar Autocommit: Es crucial para evitar confusiones y manejar las transacciones con control total.
¿Cómo se gestionan transacciones con múltiples consultas?
Para ejecutar múltiples consultas en un bloque de transacciones, se utilizan BEGIN y COMMIT. Esto es esencial para realizar cambios complejos donde todas las acciones deben tener éxito.
¿Qué pasa si una inserción falla por una clave duplicada?
En caso de que una consulta dentro de una transacción falle, por ejemplo, al intentar insertar un ID que ya existe, toda la transacción se revertirá.
BEGIN;INSERTINTO tren (modelo, capacidad)VALUES('Modelo Existente',300);-- Suponiendo que este modelo ya existeCOMMIT;-- La inserción fallará y se usará ROLLBACK automáticamente.
¿Cuándo es útil el uso explícito de ROLLBACK?
Aunque ROLLBACK implícito se utiliza automáticamente, hay casos donde definirlo explícitamente es benéfico, como al implementar lógicas de negocio personalizadas.
Ejemplo práctico:
Imagina querer limitar inserciones a un máximo de tres pasajeros para un vuelo específico. Se podría usar una condición de negocio que trigger ROLLBACK explícito cuando se intenta agregar un cuarto pasajero.
BEGIN;-- lógica antes del INSERTIF(SELECTCOUNT(*)FROM pasajeros WHERE vuelo_id =1)>=3THENROLLBACK;ENDIF;INSERTINTO pasajeros (nombre, vuelo_id)VALUES('Nuevo Pasajero',1);COMMIT;
Recomendaciones para el manejo de transacciones
Planifica tus transacciones: En cualquier operación crítica, asegúrate de que tus consultas están bien diseñadas para evitar fallas.
Prueba en un entorno seguro: Antes de implementar transacciones complejas en producción, prueba en un entorno de desarrollo para evitar errores costosos.
Documenta y educa: Familiariza a tu equipo con las prácticas recomendadas para transacciones seguras y eficientes.
El manejo adecuado de transacciones garantiza la integridad de la base de datos y previene inconsistencias que pueden ser críticas en aplicaciones sensibles. Sigue aprendiendo, pues la práctica y el conocimiento son claves para la gestión eficaz de bases de datos.
Hola a todos. Mi aporte a la clase es otra forma de usar ROLLBACK con otra función de postgresql que se llama SAVEPOINT. Básicamente se pueden crear puntos de guardado por cada consulta que uno desee y hacer que el ROLLBACK solo sea efectivo hasta ese punto, es decir, que las operaciones anteriores al SAVEPOINT sí se ejecuten.
Que gran aporte!
SAVEPOINT
Es una instrucción de PostgreSQL que establece un punto de guardado dentro de una transacción. Si algo sale mal después de que se haya establecido un SAVEPOINT, la transacción puede volver al punto de guardado en lugar de revertir todos los cambios realizados hasta ese momento.
Aquí hay un ejemplo de cómo usar SAVEPOINT:
BEGIN;UPDATE accounts SET balance = balance -100WHERE user_id =1;SAVEPOINT my_savepoint;UPDATE accounts SET balance = balance +100WHERE user_id =2;-- Si esta instrucción falla, podemos volver al SAVEPOINT anteriorROLLBACKTOSAVEPOINT my_savepoint;-- Si no hay errores, confirmamos la transacciónCOMMIT;
25.Transacciones
Las transacciones, tienen la capacidad para empaquetar varios pasos en una sola operación “todo o nada”.y si ocurre alguna falla que impida que se complete la transacción, entonces ninguno de los pasos se ejecuta y no se afecta la base de datos en absoluto.
SQL Transacción - Estructura
La transacciones tienen la siguiente estructura postgres. Postgres en las operaciones normales usa de manera implícita el rollback el rollback.
BEGIN;<Intrucciones>COMMIT|ROLLBACK
SQL Transacción - Ejemplo en PgAdmin
Desactivamos en la equina superior de pg-admin el auto commit
SQL Transacción - Ejemplo de un rollback implícito
Como se puede visualizar en el ejemplo existe una inserción correcta en la tabla tren pero en la tabla estación sé está haciendo un insert a un id que existe realmente.
hola amigo gracias por el aporte quería pedirte un ejemplo de "ROLLBACK explicito" como se haría ? podrías hacer un ejemplo para entender bien.
Muy buen aporte!. Gracias
Es como Git masomenos hahaha :D
Exacto, este tema se puede generalizar o asociar con el funcionamiento de git.
El BEGIN; es como hacer git add .
El COMMIT; es como hacer git commit -m "Comentario"
El ROLLBACK; es como hacer git rm --cached . o también git reset --mixed
Información resumida de esta clase
#EstudiantesDePlatzi
Las transacciones nos ayudan a llevar a cabo procesos complejos de manera segura, si una transacción falla, la base de datos no genera los cambios.
Las funciones para las transacciones son: BEGIN, COMMIT y ROLLBACK
BEGIN inicia la consulta con las condiciones, COMMIT guarda los cambios al final y ROLLBACK devuelve todo si algo quedo mal
Debemos verificar en las opciones de ejecución que no esté activado el COMMIT
Postgre por defecto corre el ROLLBACK cuando una transacción presenta problemas
por que dices que BEGIN, COMMIT y ROLLBACK son funciones? yo habria dicho que son palabras reservadas del lenguaje o algo asi pero ahora tengo la duda
Son palabras reservadas del lenguaje que lanzan un función por ejemplo en el caso de la palabra Commit lo que hace es guardar los cambios, la palabra Begin lanza una función que inicia la consulta con las condiciones :)
Puedes llamarlos como quieras, pero creo que la manera correcta es la tuya. podemos decir que son palabras reservadas
Las transacciones, tienen la capacidad para empaquetar varios pasos en una sola operación “todo o nada”.y si ocurre alguna falla que impida que se complete la transacción, entonces ninguno de los pasos se ejecuta y no se afecta la base de datos en absoluto.
COMMIT
Muy importante para mantener la integridad de los datos. Hay que tene rmucho cuidado en cerrar siempre la transaccion, ya sea con COMIMIT o ROLLBACK.
Entonces una transacción sirve para agrupar varias consultas juntas y garantizar que cada una de ellas se ejecute de manera exitosa, en caso de que alguna falle, todas las operaciones del bloque que comienza con BEGIN se ven descartadas, sin duda muy interesante!
Intente hacer el codigo para solo permitir 3 personas que sean vip. Lo que intente fue que a la hora de ejecutar cuantas personas vip habian si era mayor a 3 trataba de hacer caer en error. Este fue mi resultado.
Me hubiera gustado que el ejemplo de ROLLBACK, lo hicieran aunque pues siempre esos problemas raros lo buscan es a uno
Creo que la noción es clara para los que hemos usado Git y Github
Aqui les va un ejemplo en una transaccion de dinero mis amigues:
BEGIN;
UPDATE cuentas SET saldo = saldo - 100 WHERE id = 1; -- Restar de la cuenta 1
-- Verificamos si la operación fue exitosa
IF (SELECT saldo FROM cuentas WHERE id = 1) < 0 THEN
ROLLBACK; -- Si no hay suficiente saldo, deshacer
RAISE EXCEPTION 'Saldo insuficiente';
ELSE
UPDATE cuentas SET saldo = saldo + 100 WHERE id = 2; -- Agregar a la cuenta 2
COMMIT; -- Si todo fue bien, confirmar la transacción
END IF;
Esto tiene muchisima importancia cuando te encuentras en un entorno real, funcionando con una DB de negocio,
Claro, me imagino que debe ser muy utilizado para transacciones de valores y hasta de información.
Esto me recuerda no solo el uso de transacciones, sino tb que debemos controlarlo o gestionarlo dependiendo de la logica de negocio.
Para realizar un rollback de manera explicta podría ser dentro de una función (PL) escrita en plpgsql
Las transacciones son un concepto fundamental en las bases de datos relacionales que garantiza la consistencia y la integridad de los datos. Una transacción agrupa una serie de operaciones en una unidad atómica, lo que significa que todas las operaciones se realizan como una única entidad o ninguna se realiza en absoluto
BEGINTRANSACTION;--Inicia la transacción
--Realiza operaciones SQL aquí
UPDATE tabla SET columna = valor WHERE condición;--Verifica si todo está bien
IF todo_esta_bien THENCOMMIT;--Confirma la transacción
ELSEROLLBACK;--Deshace la transacción
ENDIF;
Ojala funcionara asi en Peru. En peru si la transaccion falla se realiza igual la transaccion, pero, no te llega constancia de transferencia. El destinatario feliz porque tiene el dinero y no tienes como probarle que se transfirio.
Es importante tener en cuenta que las transacciones pueden afectar el rendimiento del sistema de bases de datos, ya que pueden bloquear las tablas y las filas que se están modificando hasta que se finalice la transacción. Por lo tanto, es recomendable utilizar transacciones solo cuando sea necesario y en casos donde se requiera la integridad de los datos y la consistencia de las operaciones.