A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Curso de PostgreSQL

Curso de PostgreSQL

Oswaldo Rodr铆guez Gonz谩lez

Oswaldo Rodr铆guez Gonz谩lez

Transacciones

25/32
Recursos

Aportes 37

Preguntas 7

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

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 鈥渢odo 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

  1. Desactivamos en la equina superior de pg-admin el auto commit

  2. 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 鈥渢odo 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.

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;

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.

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;

Esto tiene muchisima importancia cuando te encuentras en un entorno real, funcionando con una DB de negocio,

Creo que la noci贸n es clara para los que hemos usado Git y Github

Para realizar un rollback de manera explicta podr铆a ser dentro de una funci贸n (PL) escrita en plpgsql

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

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.

馃槀

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

    • Las transacciones comienzan con un begin.
    • Para indicar que todas las sentencias SQL han terminado correctamente utilizamos el comando commit.
    • En el caso que se deba cancelar la transacci贸n y no tomar en cuenta las sentencias SQL ya comenzados utilizamos el comando rollback.
    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 (鈥楨stacion Transaccion鈥, 鈥楧ire鈥);

INSERT INTO public.tren(
 modelo, capacidad)
VALUES ('Modelo Transaccion', 524);
--ROLLBACK
COMMIT;

Excelente explicaci贸n.