Re: Duda en necesidad de bloquear tablas

From: "Jaime Casanova" <jcasanov(at)systemguards(dot)com(dot)ec>
To: "Arturo Munive [pgsql-es-ayuda]" <arturomunive(at)gmail(dot)com>
Cc: Postgresql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Duda en necesidad de bloquear tablas
Date: 2008-06-21 03:19:14
Message-ID: 3073cc9b0806202019p175b5b11jd14d1b1f7da74d21@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2008/6/20 Arturo Munive [pgsql-es-ayuda] <arturomunive(at)gmail(dot)com>:
>
> 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.
>
[...]
>
> 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.

una forma es usar transacciones serializables (estas simulan ir en
serie una tras otra)
http://www.postgresql.org/files/developer/transactions.pdf

> ¿debo bloquear la tabla para no permitir inserciones?

Esta es otra opcion, pero en vez de bloquear toda la tabla podrias
usar SELECT .. FOR UPDATE para bloquear solo los registros
involucrados

> ¿la debo bloquear incluso antes de leer los montos de los pagos anteriores,
> antes del paso 3?

En el caso de la tabla de compras es posible que tengas que hacerlo
porque tienes un campo calculado ahi... a menos que uses transacciones
serializables

> Y si es asi como la bloqueo.
>

SELECT ... FOR UPDATE

> 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.
>

RAISE EXCEPTION

--
Atentamente,
Jaime Casanova
Soporte y capacitación de PostgreSQL
Guayaquil - Ecuador
Cel. (593) 87171157

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Miguel Rodríguez Penabad 2008-06-21 13:53:35 Re: AYUDA CON TRIGER - URGENTE
Previous Message Marcos Saldivar 2008-06-21 01:36:23 Re: Duda en necesidad de bloquear tablas