Ver Mensaje Individual
  #5 (permalink)  
Antiguo 03/11/2009, 08:37
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: commit en postgres

Imagina que administras una base de datos de millones de datos.
Un update a un campo te puede dañar toda la información 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 daños.

Lo que dices es exactamente lo que es.
begin; Es el inicio de una transacción. 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 transacción.
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 transacción con los cambios establecidos.

Con un ejemplo:
Código sql:
Ver original
  1. pruebas=>  SELECT *FROM producto;
  2.  id |    descr
  3. ----+-------------
  4.   1 | hoja
  5.   2 | hoja carta
  6.   3 | hoja oficio
  7.   4 | lapicero
  8. (4 filas)
  9.  
  10. pruebas=> BEGIN;
  11. BEGIN
  12. pruebas=> UPDATE producto SET descr=REPLACE(descr,'hoja','papel');
  13. UPDATE 4
  14. pruebas=>  SELECT *FROM producto;
  15.  id |    descr
  16. ----+--------------
  17.   1 | papel
  18.   2 | papel carta
  19.   3 | papel oficio
  20.   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.
Código sql:
Ver original
  1. pruebas=> SAVEPOINT a;
  2. SAVEPOINT
  3. pruebas=> UPDATE producto SET descr=REPLACE(descr,'lapicero','boligrafo');
  4. UPDATE 4
  5. pruebas=>  SELECT *FROM producto;
  6.  id |    descr
  7. ----+--------------
  8.   1 | papel
  9.   2 | papel carta
  10.   3 | papel oficio
  11.   4 | boligrafo
  12. (4 filas)
Mierda!!! no era bolígrafo 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.
Código sql:
Ver original
  1. pruebas=> ROLLBACK TO a;
  2. ROLLBACK
  3. pruebas=>  SELECT *FROM producto;
  4.  id |    descr
  5. ----+--------------
  6.   1 | papel
  7.   2 | papel carta
  8.   3 | papel oficio
  9.   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.
Código sql:
Ver original
  1. pruebas=> UPDATE producto SET descr=REPLACE(descr,'lapicero','pluma');
  2. UPDATE 4
ahora todo está bien. Solo nos queda confirmar la terminación de la transacción y terminarla.
Código sql:
Ver original
  1. pruebas=> commit;
  2. COMMIT
  3. pruebas=>  SELECT *FROM producto;
  4.  id |    descr
  5. ----+--------------
  6.   1 | papel
  7.   2 | papel carta
  8.   3 | papel oficio
  9.   4 | pluma
  10. (4 filas)

con respecto a tu pregunta:
Cita:
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??
No es necesario. Cada sentencia se usa deacuerdo a las necesidades que tengas.
Si no tienes errores, solo es necesario el begin y el commit
__________________
Without data, You are another person with an opinion.
W. Edwads Deming