Está en la página 1de 3

TRANSACCIONES EN POSTGRESQL

BEGIN : Comienza la transaccion RollBack: Retrocede la transaccion por cualquier error COMMIT: Finaliza la transaccion hasta creo que es asi. ejemplo: BEGIN; UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice'; SAVEPOINT my_savepoint; UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob'; -- oops ... forget that and use Wally's account ROLLBACK TO my_savepoint; UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Wally'; COMMIT; hay una funcion que se llama SAVEPOINT me imagino que es "guardar punto", esto hay que colocarlo cada vez que se hace una consulta, actualizacion, o inserccion, por que aca solo lo muestra en un solo lado, ahh y tambien hay que colocar el rollback la cantidad de veces que ponemos los savepoint??

Imagina que administras una base de datos de millones de datos. Un update a un campo te puede daar toda la informacin sin posibilidad de recuperarla. Para hacer cambios a la base de datos se debe ser muy cuidadoso y tener las herramientas para recuperarse de posibles daos. Lo que dices es exactamente lo que es. begin; Es el inicio de una transaccin. Con solo poner esta clausula es posible recuperar errores que puedas sufrir. savepoint; Con esta sentencia haces un commit hasta el punto que estes seguro no tienes errores. La diferencia con commit es que no se finaliza la transaccin. rollback; Deshace todos los cambios que se hayan realizado desde la sentencia begin. o hasta donde hayas confirmado con savepoint. commit; Confirma y termina la transaccin con los cambios establecidos. Con un ejemplo: Cdigo sql:
Ver originalCopiar

1. 2. 3. 4. 5. 6. 7. 8. 9.

pruebas=> SELECT *FROM producto; id | descr ----+------------1 | hoja 2 | hoja carta 3 | hoja oficio 4 | lapicero (4 filas)

10. pruebas=> begin; 11. BEGIN 12. pruebas=> UPDATE producto SET descr=REPLACE(descr,'hoja','papel'); 13. UPDATE 4

14. pruebas=> 15. id |

SELECT *FROM producto;

descr

16. ----+-------------17. 18. 19. 20. 1 | papel 2 | papel carta 3 | papel oficio 4 | lapicero

21. (4 filas)

Hemos cambiado la palabra hoja por papel. Todo anda muy bien. Entonces vamos a confirmar hasta este punto que todo va bien haciendo uso de savepint. Cdigo sql:
Ver originalCopiar

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

pruebas=> savepoint a; SAVEPOINT pruebas=> UPDATE producto SET descr=REPLACE(descr,'lapicero','boligrafo'); UPDATE 4 pruebas=> id | SELECT *FROM producto;

descr

----+-------------1 | papel 2 | papel carta 3 | papel oficio 4 | boligrafo

12. (4 filas)

Mierda!!! no era bolgrafo sino pluma. Debemos deshacer todos los cambios!!!. Pero si ya tenia todo bueno hasta aca y no quiero volver a empezar. Utilizamos savepoint para deshacer los cambios hasta ese punto. Cdigo sql:
Ver originalCopiar

1. 2. 3. 4. 5. 6.

pruebas=> rollback TO a; ROLLBACK pruebas=> id | SELECT *FROM producto;

descr

----+-------------1 | papel

7. 8. 9.

2 | papel carta 3 | papel oficio 4 | lapicero

10. (4 filas)

Mira que el cambio de hoja a papel se conserva y solo se recupera la palabra lapicero. Corregimos el error. Cdigo sql:
Ver originalCopiar

1. 2.

pruebas=> UPDATE producto SET descr=REPLACE(descr,'lapicero','pluma'); UPDATE 4

ahora todo est bien. Solo nos queda confirmar la terminacin de la transaccin y terminarla. Cdigo sql:
Ver originalCopiar

1. 2. 3. 4. 5. 6. 7. 8. 9.

pruebas=> commit; COMMIT pruebas=> id | SELECT *FROM producto;

descr

----+-------------1 | papel 2 | papel carta 3 | papel oficio 4 | pluma

10. (4 filas)