Busqueda sobre Linux y software libre

Noticias sobre linux y software libre - Google 

Transacciones en PostgreSQL

Pregunta

Necesito saber cómo controlar el consecutivo para varias terminales usando php y postgreSQL 8.3.

Problema:
(...)
Supongamos que el consecutivo lo tengo en 1230
Caja 1: nueva factura.
Lee el consecutivo: 1230.
(...)
Caja 2: nueva factura.
Lee el consecutivo: 1230.
(...)
Caja 3: nueva factura.
Lee el consecutivo: 1230.
(...)

Y cuando quieren guardar el sistema se quiebra porque no acepta 3 facturas con el mismo número y tal vez en uno de los casos, solo uno de ellos logre guardar y los otros no. Luego pensé en vez de consultarlo antes y presentarlo en pantalla, mejor no lo muestro y lo genero al momento de guardar.

Respuesta


Claro, es que estás pensando en consecutivos ;-) Y eso va en contra de la realidad. En PostgreSQL, para evitar este tipo de situaciones tienes las secuencias. Las secuencias son "empujadas" hacia adelante _fuera_ de las transacciones - y esto se sostiene tanto en PostgreSQL como en cualquier otro RDBMS. En este caso, un SELECT nextval ('num_factura') como el que mencionas habría respondido 1230, 1231 y 1232 a cada unade las cajas. Pero, sí, si la transacción de la caja #2 se aborta,entonces quedará un agujero en 1232. ¿Y qué haces con eso? Nada, así es el universo.

Otra respuesta


Hola, no se de PostgreSQL pero una vez utilicé algo así

al momento de guardar entra en un bucle de n segundos que revisa si la tabla es escribible. Si la tabla es escribible: 1) lookeo la tabla (nadie mas puede escribir) 2) Releo el consecutivo 3) grabo los datos 4) des-lookeo la tabla bueno es una posibilidad desde el codigo.

y otra respuesta más


en realidad para este tipo de transacciones, no solo por comodidad,sino principalmente por seguridad se utiliza el nextval ...cuando creas una secuencia, esta permanece con un valor inicial,esperando a que alguien consulte su valor.... el uso optimo por consiguiente es similar a insert into person (P_id,lastname,firstname) values (PersonSN.nextval,'Lastname','Firstname') donde person es tu tabla , P_id es el campo unico secuencial consecutivo y PersonSN es la secuencia... de esta forma ante cualquier insert se llama a nextval. Nextval nunca tendrá el mismo valor dos veces, por ejemplo en la primera inserción el currentval es 1 en la siguiente, la llamada a nextval será 2. De esta forma aunque tengas 50 terminales siempre se llamará a Nextval, lo que te garantiza que no existirán duplicados. Esto es más simple, más seguro y más optimo que bloquear y desbloquear una tabla. y si por alguna razón necesitas conocer el numero que tiene la secuencia solo llamas aPersonSN.currval Obviamente necesitas crear previamente la secuencia. El principal problema que tiene este método independientemente que si falla una secuencia se perderá un valor del nextval es que alguien semeta a hacer inserts directamente en base... tal que si insertas diez registros tu secuencia se queda atrás por diez y en consecuencia no podrás insertar... mientras no modifiques la secuencia :p

Ads by CJ - Linux Foundation

Share This