Re: Manejo de secuencias dentro de transacciones

From: Horacio Miranda <hmiranda(at)gmail(dot)com>
To: "Lorena Gpe(dot) M(dot) Osorio" <peque35(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Manejo de secuencias dentro de transacciones
Date: 2010-10-14 04:35:33
Message-ID: AANLkTi=vKuigGqHXbB7hFgqSk8N52Mh81sfn3O-PrjCk@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Sorry pero no habia leido esto. mi sospecha es correcta al parecer.

Important: To avoid blocking of concurrent transactions that obtain
numbers from the same sequence, a nextval operation is never rolled
back; that is, once a value has been fetched it is considered used,
even if the transaction that did the nextval later aborts. This means
that aborted transactions may leave unused "holes" in the sequence of
assigned values. setval operations are never rolled back, either.

http://www.postgresql.org/docs/8.1/interactive/functions-sequence.html

Saca el nextval del insert (ponelo como defecto DEFAULT NEXTVAL('sq')
, eso deberia resolver tu problema).

2010/10/14 Horacio Miranda <hmiranda(at)gmail(dot)com>:
> Me da la sensaccion que si haces un nextval, es correcto que
> incremente la secuencia se aborte o no la transaccion (por que estas
> haciendo abort del insert), ahora si creas un valor por defecto donde
> solo insertas los datos y si abortas la secuencia no deberia
> incrementar.
>
> http://sqlzoo.net/howto/source/u.cgi/tip000001/postgres
>
> algo como sale en este ejemplo. CREATE SEQUENCE sq;
> CREATE TABLE t_test(
>  id INTEGER PRIMARY KEY DEFAULT NEXTVAL('sq'),
>  name VARCHAR(10)
>  );
> INSERT INTO t_test(name)
>  VALUES ('Andrew');
> INSERT INTO t_test(name)
>  VALUES ('Gordon');
> SELECT * FROM t_test;
>
>
> ####
>
> Pero no tengo mucha experiencia como para asegurarlo, es una
> sensación.... hare el lab para ver como me va, en base a lo que te
> envio aca.
>
>
> 2010/10/14 Lorena Gpe. M. Osorio <peque35(at)gmail(dot)com>:
>> BUENOS TARDES!!
>>
>> tengo el siguiente bloque de transaccion
>>
>> BEGIN;
>> INSERT INTO empenos(esuc, efolio, ecliente_id, ehora, estatus, eint_mensual,
>> eint_diario, efch_emp, efch_ven, eprestamo, eprorroga, eprc_finan, eprc_ope,
>> eprc_custodia, eprc_impuesto, efch_ult_pago, evaluador, efecha_adj,
>> etipo_pla, econt, elk_cont, efch_corte, eavaluo, efch_ven_ant, eiva, efinan,
>> eopera, ecusto) VALUES ('RE3', ( 'RE3' || 'E' || '-' ||
>> LPAD(cast(nextval('re3_E' )as varchar),5,'0') ) , '516', '10:29', 'E',
>> '20.181', '0.6727', '2010-10-13', '2010-11-12', '100', '10', '5.0455',
>> '8.0727', '7.0636', '11', '1900-01-01', 'EGALLEGOS', '1900-01-01', '30',
>> '1', '0', '1900-01-01', '200', '2010-10-13', '11', '5.046', '8.073',
>> '7.064');
>>
>> INSERT INTO empmercanx( mer_suc_id, mer_num_inv, mer_clasif, mer_marca,
>> mer_modelo, mer_serie, mer_color, mer_ubicacion, mer_metal, mer_kilates,
>> mer_desc, mer_costo, mer_pre_venta, mer_peso, mer_status, mer_origen,
>> mer_dividido, mer_scrap, mer_ciu, mer_folio, mer_costo_emp, mer_tipo) VALUES
>> ('RE3 ','RE3E-0009801','','SAGEM','MOSSS','SS','ROJO
>> ','CAJA',0,0,'DEC',100.00,200,0,'E',0,FALSE,FALSE,'REYNOSA','RE3E-00098',100.00,'N');
>> INSERT INTO auditomer( aud_suc_id, aud_mvt_id, aud_fol_movto, aud_num_inv,
>> aud_fecha, aud_status, aud_val_id)VALUES ('RE3
>> ',1,'RE3E-00098','RE3E-0009801', '2010-10-13', 'E', 'EGALLEGOS');INSERT INTO
>> empbitaco( bit_tipo_ope, bit_fecha, bit_hora, bit_modulo, bit_tabla,
>> bit_reg_llave, bit_val_id) VALUES ('AGREGAR','2010-10-13', '10:10','E',
>> 'EMPENOS','RE3E-00098|RE3 |1', 'EGALLEGOS');
>> INSERT INTO cotitular(coti_nombre, coti_empeno, coti_cliente,
>> coti_fechaemp,coti_horaemp)
>> VALUES ('NO PROPORCIONA', 'RE3E-00098', '516', '2010-10-13', '10:29');
>> INSERT INTO movempeno( mov_suc_id, mov_mvt_id, mov_folio, mov_carabo,
>> mov_fecha, mov_cliente, mov_val_id, mov_importe, mov_car, mov_abo,
>> mov_intmora, mov_cont, mov_lkcont, mov_usu, mov_hora, mov_status,
>> mov_tipopago, mov_fchcorte, mov_folref, mov_posant, mov_fch_intmora,
>> mov_adicional, mov_ndiasadi) VALUES ('',1 , '', 'C', '2010-10-13', '',
>> 'EGALLEGOS', 0, 0, 0, 0,0,0, 'EGALLEGOS', '10:10','A', 'n', '1900-01-01',
>> '', 'E','1900-01-01',0,0);
>>
>> INSERT INTO movempeno( mov_suc_id, mov_mvt_id, mov_folio, mov_carabo,
>> mov_fecha, mov_cliente, mov_val_id, mov_importe, mov_car, mov_abo,
>> mov_intmora, mov_cont, mov_lkcont, mov_usu, mov_hora, mov_status,
>> mov_tipopago, mov_fchcorte, mov_folref, mov_posant, mov_fch_intmora,
>> mov_adicional, mov_ndiasadi) VALUES ('',14 ,( 'RE3' || 'E' || '-' ||
>> LPAD(cast(nextval('re2' ||'_'||'E')as varchar),'5','0')), 'C', '2010-10-13',
>> '', 'EGALLEGOS',20.18, 20.18, 0, 0,0,0, 'EGALLEGOS', '10:10','A', 'n',
>> '1900-01-01', '', 'I','1900-01-01',0,0);
>>
>> COMMIT;
>>
>>
>>
>> pero tengo el siguiente problema, aunque la transaccion se aborte como
>> quiera me incrementa el valor de mi secuencia, y como el folio lo formo con
>> la secuencia, pues relativamente se esta comiendo un folio, no inserta los
>> datos en  las tablas pero si se incrementa el valor de la secuencia, podrias
>> o podrian decirme donde esta el error?, acaso estoy utilizando mal la
>> secuecia?
>>
>> es de verdad urgente de antemano gracias por la ayuda.
>>
>> saludos!!!
>>
>> <!--[if !vml]-->
>>
>>
>>
>>
>>
>>
>>
>> --
>> L.S.C. Lorena Gpe. M. Osorio
>>
>
>
>
> --
> Saludos,
> Horacio Miranda Aguilera.
>

--
Saludos,
Horacio Miranda Aguilera.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2010-10-14 11:35:37 Re: Manejo de secuencias dentro de transacciones
Previous Message Horacio Miranda 2010-10-14 04:32:28 Re: Manejo de secuencias dentro de transacciones