Duda en necesidad de bloquear tablas

From: "Arturo Munive [pgsql-es-ayuda] " <arturomunive(at)gmail(dot)com>
To: Postgresql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Duda en necesidad de bloquear tablas
Date: 2008-06-21 00:57:35
Message-ID: 485C51FF.5050608@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola a todos:
tengo una duda en cuanto a como armar una función ( ya sea del lado del
cliente o un proc almacenado)

El asunto es el que sigue:
tengo 2 tablas una llamada compras y otra llamada pagos:
aca versiones simplificadas de las mismas

CREATE TABLE "test"."compras" (
"id" SERIAL,
"valor" INTEGER,
"pagada" BOOLEAN DEFAULT false NOT NULL,
CONSTRAINT "c_pkey" PRIMARY KEY("id")
);

CREATE TABLE "test"."pagos" (
"id" SERIAL,
"id_compra" INTEGER,
"valor" INTEGER,
CONSTRAINT "p_pkey" PRIMARY KEY("id")
);

los pagos pueden ser parciales para cada compra , es decir una compra
puede ser cancelada(pagada) por uno o mas pagos
el procedimiento lógico para efectuar un pago es el siguiente:

1. verifico que la compra no esta pagada.
2. calculo cuanto suman los pagos anteriores que se le hicieron a la compra
3. verifico que el valor del nuevo pago mas los pagos anteriores no
superan al monto de la compra.
4. inserto el pago en su tabla
5. si la suma de los pagos es igual a el valor la compra, actualizo la
compra estableciendo el campo pagada = TRUE.

Obviamente se que todas estas acciones las debo realizar dentro de una
transaccion.
Mis dudas son las siguientes (la primera es mas importante que la segunda):

A. Como puedo asegurar que entre el instante que verifico la suma de los
pagos anteriores (paso 3)y la inserción del pago que yo
quiero hacer (paso 4) nadie inserte (borre o modifique) otro pago
para la misma compra.
¿debo bloquear la tabla para no permitir inserciones?
¿la debo bloquear incluso antes de leer los montos de los pagos
anteriores, antes del paso 3?
Y si es asi como la bloqueo.

B. Si estos 5 pasos los hiciera dentro de un procedimiento almacenado,
como haria para forzar que el procedimiento
termine y haga un rollback de cualquier dato actualizado es decir si
tengo:
BEGIN
-- hago algun insert
-- hago algun update
IF (ocurre una condicion no deseada)
THEN
ROLLBACK
END IF;

Cuando hago algo como lo anterior me da el siguiente mensaje:

ERROR: SPI_execute_plan failed executing query "ROLLBACK":
SPI_ERROR_TRANSACTION

Cual seria la forma de dada una condicion deshacer los cambios en un
procedimiento.

Estoy abierto a recibir cualquier tipo de sugerencia, ya sea para
resolver el problema como lo planteo, modificar el planteamiento,
agregar alguna columna de control etc etc etc.

Gracias

---------------------------------------------------------
ARTURO MUNIVE SOLIS
Telefono: (51-54)424701
Celular : (51-54)959992034
[Desarrollo De Soluciones Java-PostgreSQL Arequipa-Perú]

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Arturo Munive [pgsql-es-ayuda] 2008-06-21 01:05:56 Re: ¿Existe alguna IDE para postgres?
Previous Message Juan Carlos Badillo Goy 2008-06-20 20:57:42 Ayuda con una funcion SQL