Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-es-ayuda by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group