Este articulo es muy bueno, me aclaro algunas dudas
https://todopostgresql.com/comandos-de-transacciones-en-postgresql/
Configurar Postgres
Qué aprenderás sobre PostgreSQL
¿Qué es Postgresql?
Instalación y configuración de la Base de Datos
Interacción con Postgres desde la Consola
PgAdmin: Interacción con Postgres desde la Interfaz Gráfica
Archivos de Configuración
Comandos más utilizados en PostgreSQL
Presentación del Proyecto
Tipos de datos
Diseñando nuestra base de datos: estructura de las tablas
Jerarquía de Bases de Datos
Gestión de la información en bases de datos
Creación de Tablas
Particiones
Creación de Roles
Llaves foráneas
Inserción y consulta de datos
Inserción masiva de datos
Generar consultas avanzadas
Cruzar tablas: SQL JOIN
Funciones Especiales Principales
Funciones Especiales Avanzadas
Vistas
PL/SQL
Triggers
Integrar bases de datos con servicios externos
Simulando una conexión a Bases de Datos remotas
Transacciones
Otras Extensiones para Postgres
Implementar mejores prácticas
Backups y Restauración
Mantenimiento
Introducción a Réplicas
Implementación de Réplicas en Postgres
Otras buenas prácticas
Cierre del curso
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Aportes 41
Preguntas 9
Este articulo es muy bueno, me aclaro algunas dudas
https://todopostgresql.com/comandos-de-transacciones-en-postgresql/
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.
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
Iniciamos la transacción
BEGIN;
INSERT INTO public.estacion(nombre,direccion)
VALUES('Estación Transacción',' 1');
INSERT INTO public.tren(modelo,capacidad)
VALUES('Modelo Transacción','2');
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.
BEGIN;
INSERT INTO public.tren(modelo,capacidad)
VALUES('Modelo Transacción 2','2');
INSERT INTO public.estacion(id,nombre,direccion)
VALUES(101,'Estación Transacción 2',' 1');
COMMIT;
Es como Git masomenos hahaha 😄
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.
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
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.
BEGIN;
SELECT now();
COMMIT;
BEGIN;
INSERT INTO public.tren(
modelo, capacidad)
VALUES ( 'Model Tran', 100);
INSERT INTO public.estacion(
id, nombre, direccion)
VALUES ( 2,'Begin', 'Tran');
COMMIT;
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.
BEGIN;
INSERT INTO vip (id,fecha)
VALUES (50,NOW());
DO $$
DECLARE
rec record;
x integer := 0;
BEGIN
FOR rec IN
SELECT *
FROM vip
LOOP
x:= x+1;
END LOOP;
IF
x>3 THEN x=0;
ROLLBACK;
END IF;
END
$$;
COMMIT;
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!
Esto tiene muchisima importancia cuando te encuentras en un entorno real, funcionando con una DB de negocio,
Me hubiera gustado que el ejemplo de ROLLBACK, lo hicieran aunque pues siempre esos problemas raros lo buscan es a uno
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
Creo que la noción es clara para los que hemos usado Git y Github
Here, the documentation: https://www.postgresql.org/docs/8.3/tutorial-transactions.html
😂
En resumen:
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.
Las transacciones en PostgreSQL
son un mecanismo que permite realizar múltiples operaciones sobre la base de datos como una sola unidad de trabajo.
Esto significa que si una operación falla, todas las operaciones realizadas en la transacción son revertidas, garantizando la integridad de los datos.
BEGIN
”, seguido de una serie de sentencias SQL, y se finalizan con el comando “COMMIT
” o “ROLLBACK
”. Este mecanismo es esencial para asegurar la consistencia y la integridad de los datos en la base de datos.BEGIN;
INSERT INTO table_name (column1, column2, column3)
VALUES ('value1', 'value2', 'value3');
UPDATE table_name
SET column2 = 'new_value'
WHERE column1 = 'value1';
COMMIT;
En este ejemplo, la sentencia BEGIN
inicia la transacción. Luego se inserta un nuevo registro en la tabla table_name
con valores específicos para las columnas. Después, se actualiza el registro con un nuevo valor en la columna column2
donde la columna column1
es igual a value1
. Finalmente, la sentencia COMMIT
confirma los cambios realizados en la transacción.
Excelente explicación sobre BEGIN, COMMIT y ROLLBACK… de forma muy breve y sencilla. Me parece muy interesante esta función, garantiza confiabilidad en los procesos.
Todo el código que esté entre un BEGIN y un COMMIT PostgreSQL lo considera una sola transacción (teniendo desactivado el autocommit).
Es decir: iniciada la transacción hasta que no se ejecute el COMMIT los datos van a estar en memoria pero no se van a hacer efectivos en la base de datos. Solo con la ejecución del COMMIT se hacen recién efectivos en BD.
Si una de las tareas de la transacción falla, automáticamente se ejecuta un ROLLBACK y todas las tareas de la transacción vuelven para atrás. La tarea que falló y todas las que no fallaron.
Un uso explícito de la sentencia ROLLBACK es cuando tenemos que limitar un cupo.
Por ejemplo: queremos que solo 3 pasajeros sean vip. Entonces ponemos esta restricción en la respectiva tabla y en el código inmediatamente luego de un INSERT INTO está la sentencia ROLLBACK. Si al realizar el INSERT INTO falla porque son más de 3 entonces el ROLLBACK vuelve todo para atrás.
Transacciones
BEGIN;
SELECT true;
COMMIT;
--ROLLBACK;
El enfoque de las transacciones es dar una capa de seguridad
a todo lo que se ejecuta con el fin de no generar daños en la información
de manera que no se generen cambios hasta que todo el bloque transaccional
se ejecute de manera correcta.
Muy buena clase!
AQUÍ ESTA EL EJEMPLO Y PUEDES PONER VARIAS SENTENCIAS QUE GUSTES REGISTRAR, POR ESO EN LA IMAGEN AÑADÍ UN UPDATE Y UN SELECT MÍRALO e INTÉNTALO ESPERO TE HAYA GUSTADO.
BEGIN; <Intrucciones;> COMMIT;|ROLLBACK;
Postgres en las operaciones normales usa de manera implicita el rollback
Cuando ejecutó la transacción que falló, veo que los botones de commit y rollback se activaron.
Eso quiere decir que la transacción quedó abierta, ¿O me equivoco?.
Osea, creo que realmente no se hizo un rollback automaticamente, sino que simplemente el primer insert aún no se ha consolidado con un commit.
Asumo que una transacción que queda abierta eventualmente se le agota un tiempo de espera, y allí es cuando realmente se hace un rollback.
Transacciones: Procesos complejo seguros
- Commit: Si llegamos al final devuelva todos los cambios
- Rollback: Si algo fallo que devuelva todo lo que hicimos
BEGIN
<consultas>
COMMIT | ROLLBACK
-- Si todo va correctamente hace commit
BEGIN;
INSERT INTO public.estacion(nombre, direccion)
VALUES('Estacion Transac', 'Dir1');
INSERT INTO public.tren(modelo, capacidad)
VALUES('Modelo trans', 123);
COMMIT;
-- si alguna de ellas falla, el id ya existe. Vuelve donde nos quedamos antes de Begin.
BEGIN;
INSERT INTO public.tren(modelo, capacidad)
VALUES('Modelo trans 2', 1234);
INSERT INTO public.estacion(id, nombre, direccion)
VALUES(108, 'Estacion Transac 2', 'Dir2');
ROLLBACK;
<
BEGIN ;
INSERT INTO trenes(
modelo, capacidad)
VALUES ('Modelo Ehdf2', 130);
INSERT INTO estaciones(
estacion_id, nombre, direccion)
VALUES (50 ,'Estacion Transs', 'San Pablo');
>
Para manejar errores,como try,except
Funciones para una transacción
Desactivar Auto commit
COMMIT: Para que la transacción se guarde en la tabla.
Ejemplo de ROLL BACK: Para cuando hay un error en la transacción.
Para aquellos que usen postgreSQL por consola. Se puede abrir una transacción, ir añadiendo varias sentencias SQL pero una a una, y cerrar con commit.
postgres=# BEGIN;
postgres=# SQL sentence 1;
postgres=# SQL sentence 2;
postgres=# COMMIT;
AUTOCOMMIT
Check status
postgres=# \echo :AUTOCOMMIT
Cambiar el status (ON|OFF)
postgres=# \set AUTOCOMMIT on|off;
Este tema es muy interesante ya que también te puede servir antes de ejecutar cualquier tipo de modificación, Delete, Insert, update ya que despues de ejecutar se puede ejecutar una consulta
Excelente!!!
BEGIN;
INSERT INTO public.estacion(
nombre, direccion)
VALUES (‘Estacion Transaccion’, ‘Dire’);
INSERT INTO public.tren(
modelo, capacidad)
VALUES ('Modelo Transaccion', 524);
--ROLLBACK
COMMIT;
Excelente explicación.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
o inicia sesión.