Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

commit en postgres

Estas en el tema de commit en postgres en el foro de Bases de Datos General en Foros del Web. buenos dias compañeros una pregunta, alguien me puede ayudar o dar información como buscar sobre START TRANSACTION, COMMIT, and ROLLBACK en postgres...
  #1 (permalink)  
Antiguo 02/11/2009, 10:13
 
Fecha de Ingreso: diciembre-2008
Mensajes: 805
Antigüedad: 15 años, 5 meses
Puntos: 20
commit en postgres

buenos dias compañeros


una pregunta, alguien me puede ayudar o dar información como buscar sobre START TRANSACTION, COMMIT, and ROLLBACK en postgres
  #2 (permalink)  
Antiguo 02/11/2009, 10:29
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: commit en postgres

http://www.postgresql.org/docs/8.3/s...nsactions.html

En la documentacion oficial.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 02/11/2009, 11:01
 
Fecha de Ingreso: diciembre-2008
Mensajes: 805
Antigüedad: 15 años, 5 meses
Puntos: 20
Respuesta: commit en postgres

Muchas gracias compañero ahora empiezo a leer un poco
  #4 (permalink)  
Antiguo 03/11/2009, 08:20
 
Fecha de Ingreso: diciembre-2008
Mensajes: 805
Antigüedad: 15 años, 5 meses
Puntos: 20
Respuesta: commit en postgres

vi este ejemplo de begin, commit y rollback, pero.. hay algo que no entiendo


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??
gracias desde ya
  #5 (permalink)  
Antiguo 03/11/2009, 08:37
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 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
  #6 (permalink)  
Antiguo 03/11/2009, 08:49
 
Fecha de Ingreso: diciembre-2008
Mensajes: 805
Antigüedad: 15 años, 5 meses
Puntos: 20
Respuesta: commit en postgres

bien me haz aclarado un monton, mira yo te cuento lo que deseo hacer

resulta que tengo que insertar en una tabla todo los detalles de ventas, en la otra tabla actualizar el stock y en otra insertar el total de la factura, entonces lo que yo quiero es que se complete todo o nada, por que sino me va a modificar por parte los registro y voy a estar hasta las manos o sea que con un begin y el commit suficiente, puede ser????
  #7 (permalink)  
Antiguo 03/11/2009, 08:54
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: commit en postgres

Entiendo.

Pero entonces te recomiendo algo.
Haz todas estas operaciones dentro de una función o un store procedure de postgresql.
Cada función maneja transacciones implicitas y si se cae en alguna parte de las operaciones, se deshacen todos los cambios desde el inicio de la función.

Por ejemplo, yo tengo una función que haciendo operaciones matematicas, tarda apoximadamente 14 segundos operando. Si en ese tiempo hubiese un corte de energía o se cae el servidor, la función hace un rollback implicito y me permite mantener la consistencia de mis datos.

Imaginate que en el segundo 10, se cayera el servidor y guardara todos los cambios hasta ese punto y los otros no los alcanzara a realizar? Como detectaría hasta que punto llegó?

Con toda seguridad, el uso de funciones te va a solucionar tu problema y lo que tratas de hacer.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 03/11/2009, 09:36
 
Fecha de Ingreso: diciembre-2008
Mensajes: 805
Antigüedad: 15 años, 5 meses
Puntos: 20
Respuesta: commit en postgres

muchas gracias huesos, ahora estoy buscando información sobre eso para ver como es o que hay que hacer
  #9 (permalink)  
Antiguo 03/11/2009, 10:08
 
Fecha de Ingreso: diciembre-2008
Mensajes: 805
Antigüedad: 15 años, 5 meses
Puntos: 20
Respuesta: commit en postgres

volvi huesos, mira me puede seguir ayudando, por que lo que consegui es create function pero no sale mas nada, vos me podes dar un ejemplo?? si no es molestia
  #10 (permalink)  
Antiguo 03/11/2009, 10:19
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: commit en postgres

En el foro de postgresql hay muchos ejemplos.
http://www.forosdelweb.com/search.php?searchid=2810762

si quieres, puedes poner la estructura de las tablas y las acciones que quieres tomar. (de las que hablabas en un principio) y con esta información te ayudo a sacar la función para esto.

saludops
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #11 (permalink)  
Antiguo 03/11/2009, 10:42
 
Fecha de Ingreso: diciembre-2008
Mensajes: 805
Antigüedad: 15 años, 5 meses
Puntos: 20
Respuesta: commit en postgres

ESTA ES MI ESTRUCTURA DE LAS TRES TABLAS Y AL FINAL PONGO MI CODIGO EN PHP
[/CODE]
FACTURA

CREATE TABLE factura
(
idfactura int4 NOT NULL,
fecha date,
total varchar(10),
pago varchar(10),
deuda varchar(10),
a_cuenta varchar(10),
idclientes int4,
CONSTRAINT pk_idfactura PRIMARY KEY (idfactura),
CONSTRAINT fk_idclientes FOREIGN KEY (idclientes)
REFERENCES clientes (idclientes) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION

STOCK
CREATE TABLE stock
(
idstock int4 NOT NULL,
codigo varchar(15),
detalle varchar(80),
fecha_alta date,
t32 varchar(3),
t34 varchar(3),
t35 varchar(3),
t36 varchar(3),
t37 varchar(3),
t38 varchar(3),
t39 varchar(3),
t40 varchar(3),
t42 varchar(3),
t44 varchar(3),
t46 varchar(3),
t48 varchar(3),
t50 varchar(3),
t52 varchar(3),
t54 varchar(3),
t56 varchar(3),
p_vta varchar(5),
cant_pa varchar(3),
vta_cur varchar(10),
por_u varchar(3),
por_cur varchar(3),
cantidad varchar(10),
idprenda int4,
CONSTRAINT idstock PRIMARY KEY (idstock),
CONSTRAINT fk_idprenda FOREIGN KEY (idprenda)
REFERENCES prendas (idprenda) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION

VENTAS
CREATE TABLE ventas
(
idventas int4 NOT NULL,
fecha date,
codigo varchar(15),
idusuario int4,
precio_unit varchar(10),
cantidad varchar(5),
total varchar(10),
"desc" varchar(3),
CONSTRAINT pk_ventas PRIMARY KEY (idventas),
CONSTRAINT fk_user FOREIGN KEY (idusuario)
REFERENCES usuario (idusuario) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION

[CODE]


Código PHP:
<?php
require("librerias/conn.php");
$conexionConec_con_pass();

$total $_POST['cant_rows'];

$n_fac "select nextval('seq_factura')";
$Conn ConectarBD();
 
$res_fac EjecutarBD($Conn$n_fac);   

$can_fac pg_fetch_result($res_fac,0);


$clie $_POST['txtclie'];
$tot_ven $_POST['pagar'];
$pago $_POST['pagar'];
$seña $_POST['pagar'];
$fec_fac $_POST['txtfecha'];

$query2    "insert into factura values ('$can_fac','$fec_fac', '$tot_ven', '$pago', '0', '$seña', '$clie' )";
           
$resul_fac pg_query($query2);
           
   for(
$i=0$i $total$i++) {
   
            
// $var = $_POST['fec'][$i];
            
$var cambiaf_a_bd($_POST['fec'][$i]);
            
$var1 $_POST['cod'][$i];
            
$var2 $_POST['use'][$i];
            
$var3 $_POST['pre'][$i];
            
$var4 $_POST['can'][$i];
            
$var5 $_POST['pre_t'][$i];
            
$var6 $_POST['des'][$i];
            
$var7 $_POST['f_p'][$i];
            
$var8 $_POST['tal'][$i];
            
$var9 $_POST['sto'][$i];
            
    
    
BEGIN;
                
$query"INSERT INTO ventas values ((select nextval('seq_ventas')),'$var','$var1','$var2','$var3','$var4','1','1','$can_fac')";
                
$result pg_query($query);

$sql "select $var8 from stock where codigo = $var1";


 
$Conn ConectarBD();
 
$resultad EjecutarBD($Conn$sql);   
//$fdev= pg_num_rows($result);

$total pg_fetch_result($resultad,0);
$total $total $var4;
$tot_prenda $var9 $var4;

$query1 "update stock set $var8 = $total, cant_pa =$tot_prenda  where codigo  = $var1";
      
$resulta pg_query($query1);
                

}

 
COMMIT;

        
                
?>
  #12 (permalink)  
Antiguo 03/11/2009, 10:54
 
Fecha de Ingreso: diciembre-2008
Mensajes: 805
Antigüedad: 15 años, 5 meses
Puntos: 20
Respuesta: commit en postgres

ESTA ES MI ESTRUCTURA DE LAS TRES TABLAS Y AL FINAL PONGO MI CODIGO EN PHP
[/CODE]
FACTURA

CREATE TABLE factura
(
idfactura int4 NOT NULL,
fecha date,
total varchar(10),
pago varchar(10),
deuda varchar(10),
a_cuenta varchar(10),
idclientes int4,
CONSTRAINT pk_idfactura PRIMARY KEY (idfactura),
CONSTRAINT fk_idclientes FOREIGN KEY (idclientes)
REFERENCES clientes (idclientes) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION

STOCK
CREATE TABLE stock
(
idstock int4 NOT NULL,
codigo varchar(15),
detalle varchar(80),
fecha_alta date,
t32 varchar(3),
t34 varchar(3),
t35 varchar(3),
t36 varchar(3),
t37 varchar(3),
t38 varchar(3),
t39 varchar(3),
t40 varchar(3),
t42 varchar(3),
t44 varchar(3),
t46 varchar(3),
t48 varchar(3),
t50 varchar(3),
t52 varchar(3),
t54 varchar(3),
t56 varchar(3),
p_vta varchar(5),
cant_pa varchar(3),
vta_cur varchar(10),
por_u varchar(3),
por_cur varchar(3),
cantidad varchar(10),
idprenda int4,
CONSTRAINT idstock PRIMARY KEY (idstock),
CONSTRAINT fk_idprenda FOREIGN KEY (idprenda)
REFERENCES prendas (idprenda) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION

VENTAS
CREATE TABLE ventas
(
idventas int4 NOT NULL,
fecha date,
codigo varchar(15),
idusuario int4,
precio_unit varchar(10),
cantidad varchar(5),
total varchar(10),
"desc" varchar(3),
CONSTRAINT pk_ventas PRIMARY KEY (idventas),
CONSTRAINT fk_user FOREIGN KEY (idusuario)
REFERENCES usuario (idusuario) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION

[CODE]


Código PHP:
<?php
require("librerias/conn.php");
$conexionConec_con_pass();

$total $_POST['cant_rows'];

$n_fac "select nextval('seq_factura')";
$Conn ConectarBD();
 
$res_fac EjecutarBD($Conn$n_fac);   

$can_fac pg_fetch_result($res_fac,0);


$clie $_POST['txtclie'];
$tot_ven $_POST['pagar'];
$pago $_POST['pagar'];
$seña $_POST['pagar'];
$fec_fac $_POST['txtfecha'];

$query2    "insert into factura values ('$can_fac','$fec_fac', '$tot_ven', '$pago', '0', '$seña', '$clie' )";
           
$resul_fac pg_query($query2);
           
   for(
$i=0$i $total$i++) {
   
            
// $var = $_POST['fec'][$i];
            
$var cambiaf_a_bd($_POST['fec'][$i]);
            
$var1 $_POST['cod'][$i];
            
$var2 $_POST['use'][$i];
            
$var3 $_POST['pre'][$i];
            
$var4 $_POST['can'][$i];
            
$var5 $_POST['pre_t'][$i];
            
$var6 $_POST['des'][$i];
            
$var7 $_POST['f_p'][$i];
            
$var8 $_POST['tal'][$i];
            
$var9 $_POST['sto'][$i];
            
    
    
BEGIN;
                
$query"INSERT INTO ventas values ((select nextval('seq_ventas')),'$var','$var1','$var2','$var3','$var4','1','1','$can_fac')";
                
$result pg_query($query);

$sql "select $var8 from stock where codigo = $var1";


 
$Conn ConectarBD();
 
$resultad EjecutarBD($Conn$sql);   
//$fdev= pg_num_rows($result);

$total pg_fetch_result($resultad,0);
$total $total $var4;
$tot_prenda $var9 $var4;

$query1 "update stock set $var8 = $total, cant_pa =$tot_prenda  where codigo  = $var1";
      
$resulta pg_query($query1);
                

}

 
COMMIT;

        
                
?>
  #13 (permalink)  
Antiguo 03/11/2009, 12:11
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: commit en postgres

Cita:
for($i=0; $i < $total; $i++) {

// $var = $_POST['fec'][$i];
$var = cambiaf_a_bd($_POST['fec'][$i]);
$var1 = $_POST['cod'][$i];
$var2 = $_POST['use'][$i];
$var3 = $_POST['pre'][$i];
$var4 = $_POST['can'][$i];
$var5 = $_POST['pre_t'][$i];
$var6 = $_POST['des'][$i];
$var7 = $_POST['f_p'][$i];
$var8 = $_POST['tal'][$i];
$var9 = $_POST['sto'][$i];
No entiendo bien esto, pero plpgsql (Creación de funciones) soporta la clausula for y podrías simular esto en una función.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #14 (permalink)  
Antiguo 03/11/2009, 18:01
 
Fecha de Ingreso: diciembre-2008
Mensajes: 805
Antigüedad: 15 años, 5 meses
Puntos: 20
Respuesta: commit en postgres

ahh eso es lo que hace es recorrer una matriz que envio de otro archivo, pero lo que mas me interesa es saber como utilizar la funcion, sobre lo que inserto y actualizo, muchas gracias
  #15 (permalink)  
Antiguo 03/11/2009, 22:23
 
Fecha de Ingreso: diciembre-2008
Mensajes: 805
Antigüedad: 15 años, 5 meses
Puntos: 20
Respuesta: commit en postgres

HOla huesos, Cuando puedas dame una mano que no me sale nada de nada
  #16 (permalink)  
Antiguo 04/11/2009, 08:17
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: commit en postgres

Un ejemplo de una función

Código sql:
Ver original
  1. CREATE OR REPLACE FUNCTION multiplicar(INTEGER,INTEGER)
  2.   RETURNS INTEGER AS
  3. $BODY$
  4. DECLARE
  5. resultado INTEGER;
  6. BEGIN
  7. resultado:=$1*$2;
  8. RETURN resultado;
  9. END;
  10. $BODY$
  11.   LANGUAGE 'plpgsql' VOLATILE;

si la ejecutas:
Código sql:
Ver original
  1. pruebas=> SELECT multiplicar(4,5);
  2.  multiplicar
  3. -------------
  4.           20
  5. (1 fila)

Un ejemplo de función con for.
Código sql:
Ver original
  1. CREATE OR REPLACE FUNCTION sumar_dias_a_fecha(DATE,INTEGER)
  2.   RETURNS DATE AS
  3. $BODY$
  4. DECLARE
  5. fecha_final DATE;
  6. contador INTEGER;
  7. BEGIN
  8. fecha_final=$1;
  9. FOR contador IN 1..$2
  10. loop
  11.  fecha_final = fecha_final + 1;
  12. END loop;
  13. RETURN fecha_final;
  14. END;
  15. $BODY$
  16.   LANGUAGE 'plpgsql' VOLATILE;

Si lo corremos
Código sql:
Ver original
  1. pruebas=> SELECT sumar_dias_a_fecha('2009-11-04'::DATE,5);
  2.  sumar_dias_a_fecha
  3. --------------------
  4.  2009-11-09
  5. (1 fila)

le suma 5 días a una fecha.

Espero esta sea una base para que logres tu objetivo
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #17 (permalink)  
Antiguo 04/11/2009, 11:11
 
Fecha de Ingreso: diciembre-2008
Mensajes: 805
Antigüedad: 15 años, 5 meses
Puntos: 20
Respuesta: commit en postgres

muchisimas gracias, ahora lo voy a poner en practica y enseguida te aviso compañero como me fue
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:34.